简体   繁体   中英

How to map entities with inheritance - Entity Framework Core 2.0

I have a .net core 2.0 project and I'm using Entity Framework Core 2.0 I want to map an entity that has an inheritance and this inheritance has an inheritance too

My entity which I want to map 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...]
}

My BaseEntity class in [Domain.Project] :

public abstract class BaseEntity : Notifiable
{
    public BaseEntity()
    {
            CreationDate = DateTime.Now;
            IsActive = true;
    }

    [Fields...]
    [Properties...]
    [Methods...]
}

My Notifiable class (look, it have a list of Notification type) in [Shared.Project] :

public abstract class Notifiable
{
    private readonly List<Notification> _notifications;

    protected Notifiable() { _notifications = new List<Notification>(); }

    public IReadOnlyCollection<Notification> Notifications => _notifications;
    [Methods...]
}

My Notification class 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; }
}

My Entity Framework context class 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();
    }
}

My Mapping class 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;
    }
}

When I try add a migration, I get this error:

The entity type 'Notification' requires a primary key to be defined.

But neither the Notification class and neither the Notifiable class have been mapped in my context, they must not be mapped.

I do it in .net full framework and it works here is the .net full framework code

By convention EF Core discovers and maps all properties of the entity class and all its base classes . In your case, Notifications property is discovered and identified as collection navigation property , hence the element type Notification is mapped as entity.

It's because the default assumption is that the entity model represent a store model . The members representing non store attributes should be unmapped explicitly. To fix the issue, just add the following to your OnModelCreating override:

modelBuilder.Ignore<Notification>();

References:

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM