c# – 实体框架:将多个类映射到一个表

前端之家收集整理的这篇文章主要介绍了c# – 实体框架:将多个类映射到一个表前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我认为这在nhiberate中是可能的,但我的问题是关于实体框架.

在我的数据库模型中 – 我无法修改 – 我有冗余列,我想存储在不同的类中.

示例:

public class DateParams
{
    public DateTime CreationDate { get; set; }
    public DateTime ModificationDate { get; set; }

    // some methods
}

public class Localization
{
    public String EnglishLabel { get; set; }
    public String FrenchLabel { get; set; }

    // some methods
}

然后我会在我的一些模型中使用它们:

public class Account // Localization && DateParams 
{
    public int ID { get; set;  }
    public String Name { get; set; }

    public Localization Localization { get; set; }
    public DateParams DateParams { get; set; }
}

public class Lead // DateParams only
{
    public int ID { get; set; }
    public String Name { get; set; }

    public DateParams DateParams { get; set; }
}

我想要实现的是拥有这样的东西

public class LocalizationMap : EntityTypeConfiguration<Localization>
{
   public LocalizationMap()
   { 
        Property(e => e.EnglishLabel).HasColumnName("en");
        Property(e => e.FrenchLabel).HasColumnName("fr");
   }
}

public class AccountMap : EntityTypeConfiguration<Account>
{
    public AccountMap()
    {            
        HasKey(x => x.ID);
        Property(e => e.Name).HasColumnName("Name");

        HasSubMapping(new LocalizationMap());
        HasSubMapping(new DateParamsMap());

        ToTable("Account");
    }
}

我可以使用继承来解决这个问题,但C#不允许多重继承.

解决方法

您可以通过使用复杂类型来实现此目的.这些映射到名为complextypeName_propertyName的表列,但可以通过在DbContext中覆盖OnModelCreating(DbModelBuilder modelBuilder)来更改此行为,如 Entity Framework – Reuse Complex Type中所述

对于你的例子:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.ComplexType<Localization>();

    modelBuilder.Entity<Account>().Property(x => x.Localization.EnglishLabel).HasColumnName("en");
    modelBuilder.Entity<Account>().Property(x => x.Localization.FrenchLabel).HasColumnName("fr");
    // et cetera
}

猜你在找的C#相关文章