C# 为什么MapInheritedProperties()将实体映射到两个表中?
我正试图按照TPC模式映射我的实体 我有一个抽象的基类代理: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
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");