Ho un progetto .net core 2.0 e sto utilizzando Entity Framework Core 2.0 Voglio mappare un'entità che ha un'eredità e anche questa ereditarietà ha un'eredità
La mia entità che voglio mappare in [Domain.Project]
:
public class Customer : BaseEntity
{
public Customer(Name name, DateTime? birthDay, Email email, string password, List<CreditDebitCard> creditDebitCards = null)
{
CreationDate = DateTime.Now;
Name = name;
BirthDay = birthDay;
Email = email;
Password = password;
_CreditDebitCards = creditDebitCards ?? new List<CreditDebitCard>();
}
[Fields...]
[Properties...]
[Methods...]
}
La mia classe BaseEntity
in [Domain.Project]
:
public abstract class BaseEntity : Notifiable
{
public BaseEntity()
{
CreationDate = DateTime.Now;
IsActive = true;
}
[Fields...]
[Properties...]
[Methods...]
}
La mia classe Notifiable
(guarda, ha un elenco di tipo di Notification
) in [Shared.Project]
:
public abstract class Notifiable
{
private readonly List<Notification> _notifications;
protected Notifiable() { _notifications = new List<Notification>(); }
public IReadOnlyCollection<Notification> Notifications => _notifications;
[Methods...]
}
La mia classe di Notification
in [Shared.Project]
:
public class Notification
{
public Notification(string property, string message)
{
Property = property;
Message = message;
}
public string Property { get; private set; }
public string Message { get; private set; }
}
La classe di contesto My Entity Framework in [Infra.Project]
:
public class MoFomeDataContext : DbContext
{
public DbSet<Customer> Customers { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(Runtime.ConnectionString);
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<CreditDebitCard>().Map();
}
}
La mia classe Mapping
in [Infra.Project]
:
public static class CustomerMap
{
public static EntityTypeBuilder<Customer> Map(this EntityTypeBuilder<Customer> cfg)
{
cfg.ToTable("Customer");
cfg.HasKey(x => x.Id);
cfg.Property(x => x.BirthDay).IsRequired();
cfg.OwnsOne(x => x.Email);
cfg.OwnsOne(x => x.Name);
cfg.HasMany(x => x.CreditDebitCards);
return cfg;
}
}
Quando provo ad aggiungere una migrazione, ottengo questo errore:
Il tipo di entità "Notifica" richiede una chiave primaria da definire.
Ma né la classe Notification
né la classe Notifiable
sono state mappate nel mio contesto, non devono essere mappate.
Lo faccio in. Full framework completo e funziona qui è il codice completo .net
Per convenzione, EF Core individua e mappa tutte le proprietà della classe di entità e tutte le sue classi di base . Nel tuo caso, la proprietà Notifications
viene rilevata e identificata come proprietà di navigazione della raccolta , quindi il tipo di elemento Notification
viene mappato come entità.
È perché l'ipotesi predefinita è che il modello di entità rappresenti un modello di negozio . I membri che rappresentano gli attributi non store devono essere non mappati in modo esplicito. Per risolvere il problema, aggiungi quanto segue al tuo override di OnModelCreating
:
modelBuilder.Ignore<Notification>();
Riferimenti: