Come si suppone che debba mappare la classe della base di identità in EF Core se voglio che l'entità sia una chiave primaria
Ho basato l'esempio di progetto di Vaughn Vernon ( esempio ) in questo esempio per creare una classe di identità come quella:
public class ProductId : Identity
{
public ProductId()
: base()
{
}
public ProductId(string id)
: base(id)
{
}
}
ed ecco la sua implementazione
public class Product {
public ProductId ProductId {get; private set;}
}
Il mio dubbio è qual è il modo corretto per mappare questo? perché provavo a mappare direttamente modelBuilder.Entity<Product>().HasKey(p => p.ProductId);
ma in migrazione EF Core dimmelo
Impossibile chiamare la proprietà per la proprietà "ProductId" sul tipo di entità "Prodotto" perché è configurata come proprietà di navigazione. La proprietà può essere utilizzata solo per configurare proprietà scalari.
so che posso usare OwnsOne ma se lo faccio non creerò una chiave primaria di identità, giusto?
I tuoi oggetti dovrebbero assomigliare al seguente
Classe dell'oggetto
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
...
}
Per impostazione predefinita, il framework di entità cercherà un oggetto denominato Id o ProductId e lo renderà automaticamente la chiave primaria. Quindi, mentre non è necessario impostare la chiave in DbContext, è possibile farlo. Generalmente non imposto l'ID a meno che non si tratti di un nome diverso.
DbContext
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
builder.Entity<Product>().HasKey(x => x.Id);
}
** AGGIORNARE **
Se non si impostano i DbSet nel contesto db, sarà necessario impostare l'id nella chiamata OnModelCreating in modo che le migrazioni riconoscano l'oggetto come un oggetto Entity