为什么MapInheritedProperties()将我的实体映射到两个表
本文关键字:两个 实体 MapInheritedProperties 我的 为什么 映射 | 更新日期: 2023-09-27 17:50:18
我正在尝试按照TPC模式映射我的实体。
我有一个抽象基类Agent:
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; }
}
当我尝试配置订阅者如下,我已经注意到,由实体框架生成的请求是错误的:
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");
});
}
}
实体框架生成的请求是(表Agent2不存在):
SELECT E'0X0X' AS "C1",
"Extent1"."id_personne",
"Extent1"."suivi_client",
"Extent1"."id_federateur",
"Extent2"."date_mod",
"Extent2"."date_cre",
"Extent2"."insuranceCompanyPolicyNumber",
"Extent2"."keySys",
"Extent2"."id_role",
"Extent2"."statut",
"Extent2"."vsc_transactionid",
"Extent2"."numero_souscripteur"
FROM "atlas"."Agent2" AS "Extent1"
INNER JOIN "atlas"."T_ACTEUR_SOUSCRIPTEUR" AS "Extent2" ON
"Extent1"."id_personne" = "Extent2"."id_personne"
我知道如果我像这样改变订阅者的配置,它会工作的
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");
});
}
}
换句话说,如果我在Map方法的作用域之外配置属性Number,或者我没有将方法property应用到lambda的参数上,它就会工作。(Property(s => s.Number).HasColumnName("numero_souscripteur");)
有人可以解释我如何方法MapInheritedProperties()的工作?
为什么实体框架生成一个不存在的表?
谢谢
这是因为你放在一个映射片段…
Map(m => { ... })
…映射到片段应用的表。事实上,它说:映射所有属性从Agent
和属性Number
从Subsriber
到表"T_ACTEUR_SOUSCRIPTEUR"。EF通过命名约定静默地假定剩余的数据被映射到另一个表设备。只要从派生类型映射一个属性,就会发生这种情况。如果您只使用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");