Sto cercando di capire come generare il mio database in modo programmatico utilizzando Entity Framework Core e sto riscontrando problemi nell'assegnare una chiave esterna a un campo in una tabella. Ho bisogno del campo Address per fare riferimento all'oggetto Address e caricarlo quando vado a recuperare un record dal database. Se creo il database usando EnsureCreated
, crea le tabelle correttamente, tranne per il fatto che il campo AddressId non è una chiave esterna per la tabella Address. Ho provato a fare le mie ricerche su questo, e mi sono imbattuto in questo articolo , che utilizza un metodo chiamato HasForeignKey
, tuttavia qualunque cosa ritorni da Entity () non sa di HasForeignKey
. Ottengo questo errore se provo a digitarlo manualmente ottengo:
Errore CS1061 'EntityTypeBuilder' non contiene una definizione per 'HasForeignKey' e non è possibile trovare alcun metodo di estensione 'HasForeignKey' che accetta un primo argomento di tipo 'EntityTypeBuilder' (ti manca una direttiva using o un riferimento di assembly?)
Quindi ovviamente questo approccio non è valido. Ho provato a seguire questa documentazione , ma non capisco cosa sta facendo e come applicarlo alla mia situazione. Nel loro caso hanno un paio di tavoli, blog e post, dove il blog ha molti post e post ha un blog. Ho provato a seguire il meglio che potevo, ma non capisco davvero tutto il gergo e cosa sta facendo.
Come posso andare semplicemente assegnando il valore trovato in AddressId come chiave esterna a un record in Indirizzi? Questo è il codice che sto usando.
public class Person
{
[Key]
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public byte Age { get; set; }
public int AddressId { get; set; }
public Address Address { get; set; }
}
public class Address
{
[Key]
public int Id { get; set; }
public string Street { get; set; }
public string City { get; set; }
public string State { get; set; }
public string ZipCode { get; set; }
}
public class MyContext: DbContext
{
public DbSet<Person> People { get; set; }
public DbSet<Address> Addresses { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlite($"Data Source=test.db");
}
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
builder.Entity<Address>().HasKey(v => v.Id);
builder.Entity<Person>().HasKey(v => v.Id);
}
}
class Program
{
static void Main(string[] args)
{
using (var db = new MyContext())
{
//var person = db.People.Find(1);
db.Database.EnsureCreated();
var person = new Person()
{
FirstName = "Jack",
LastName = "Jackson",
Age = 50,
Address = new Address()
{
Street = "123 Street St",
City = "Jacksonville",
State = "Mississippi",
ZipCode = "00000-0000"
}
};
db.People.Add(person);
db.SaveChanges();
}
}
}
Una piccola informazione in più:
Nel tuo metodo OnModelCreating prova ad aggiornare la seguente riga in modo che assomigli a questo (non ero in grado di testare questo codice, quindi la mia formattazione potrebbe essere disattivata):
builder.Entity<Person>().HasOne(v => v.Address).HasForeignKey(v => v.AddressId);
Credo che poiché hai le annotazioni [Chiave] Dati in entrambe le entità, non è necessario impostare la chiave tramite l'API Fluent. Attenzione: sono un po 'nuovo per l'EF Core, quindi potrei sbagliarmi. :)