C# 为什么MapInheritedProperties()将实体映射到两个表中?

C# 为什么MapInheritedProperties()将实体映射到两个表中?,c#,.net,entity-framework,C#,.net,Entity Framework,我正试图按照TPC模式映射我的实体 我有一个抽象的基类代理: public abstract class Agent { public int Id { get; set; } public DateTime? ChangeDate { get; set; } public DateTime CreationDate { get; set; } public string insuranceCompanyPolicyNumb

我正试图按照TPC模式映射我的实体

我有一个抽象的基类代理:

public abstract class Agent
    {
        public int Id { get; set; }
        public DateTime? ChangeDate { get; set; }
        public DateTime CreationDate { get; set; }
        public string insuranceCompanyPolicyNumber { get; set; }
        public int? KeySys { get; set; }
        public int RoleId { get; set; }
        public Role Role { get; set; }
        public string Status { get; set; }
        public int? Transactionid { get; set; }
    }
我有一个儿童实体使用者:

public partial class Suscriber : Agent
    {
        public int? id_federateur { get; set; }
        public string Number { get; set; }
        public bool? suivi_client { get; set; }
        public virtual ICollection<Contract> Contracts { get; set; }      
    }
我知道,如果我像这样更改suscriber的配置,它将工作

public class SuscriberConfiguration : EntityTypeConfiguration<Suscriber>
    {
        public SuscriberConfiguration()
        {  
            Map(m =>
                {
                    m.MapInheritedProperties();
                    // m.Property(s => s.Number).HasColumnName("numero_souscripteur");
                    Property(s => s.Number).HasColumnName("numero_souscripteur");
                    m.ToTable("T_ACTEUR_SOUSCRIPTEUR");
                });
        }
    }
公共类用户配置:EntityTypeConfiguration
{
公共支持配置()
{  
地图(m=>
{
m、 MapInheritedProperties();
//m.Property(s=>s.Number).HasColumnName(“numero_souscripteur”);
属性(s=>s.Number).HasColumnName(“numero_souscripteur”);
m、 ToTable(“T_ACTEUR_SOUSCRIPTEUR”);
});
}
}
换句话说,如果我在方法映射的范围之外配置属性号,或者我没有将方法属性应用于lambda的参数,那么它就可以工作<代码>(属性(s=>s.Number).HasColumnName(“numero_souscripteur”);)

有人能给我解释一下MapInheritedProperties()方法是如何工作的吗

为什么实体框架生成一个不存在的表


谢谢

这是因为您将所有内容放在一个映射片段中

…映射到片段应用于的表。事实上,它的意思是:将
Agent
中的所有属性和
Number
中的
subscriber
中的属性映射到表“T_ACTEUR_sousscripteur”。EF静默地假设剩余部分通过命名约定映射到另一个表it设备。只要从派生类型映射一个属性,就会发生这种情况。如果仅使用
MapInheritedProperties()
,则所有属性(包括派生属性)都将映射到映射片段中的表

我不知道这是一个bug还是一个特性。至少不是很清楚。无论如何,您应该在映射片段之外映射其他属性名称,正如您已经发现的那样。当然,如果你在另一份声明中这样做会更清楚:

Map(m =>
    {
        m.MapInheritedProperties();
        m.ToTable("T_ACTEUR_SOUSCRIPTEUR");
    });
Property(s => s.Number).HasColumnName("numero_souscripteur");
或者,如果您愿意:

Map(m => m.MapInheritedProperties());
ToTable("T_ACTEUR_SOUSCRIPTEUR");
Property(s => s.Number).HasColumnName("numero_souscripteur");
Map(m => { ... })
Map(m =>
    {
        m.MapInheritedProperties();
        m.ToTable("T_ACTEUR_SOUSCRIPTEUR");
    });
Property(s => s.Number).HasColumnName("numero_souscripteur");
Map(m => m.MapInheritedProperties());
ToTable("T_ACTEUR_SOUSCRIPTEUR");
Property(s => s.Number).HasColumnName("numero_souscripteur");