我试图按照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; }
}
我有一个子实体Suscriber:
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时,我注意到Entity Framework生成的请求是错误的:
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");
});
}
}
Entity Framework生成的请求是(表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"
我知道如果我改变了这样的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");
});
}
}
换句话说,如果我在方法Map的范围之外配置属性Number,或者我没有将方法Property应用于lambda的参数,它就可以工作。 (Property(s => s.Number).HasColumnName("numero_souscripteur");)
有人可以解释一下MapInheritedProperties()方法的工作原理吗?
为什么Entity Framework会生成一个不存在的表?
由于
答案 0 :(得分:1)
这是因为您放入一个映射片段的所有内容 ...
Map(m => { ... })
...映射到片段适用的表。实际上它是这样说的:将Agent
和属性Number
中的所有属性从Subsriber
映射到表“T_ACTEUR_SOUSCRIPTEUR”。 EF默认地假定剩余部分通过命名约定映射到它的另一个表。一旦从派生类型映射一个属性,就会发生这种情况。如果仅使用MapInheritedProperties()
,则所有属性(包括派生属性)都将映射到映射片段中的表。
我不知道这是一个错误还是一个功能。至少目前还不是很清楚。无论如何,您应该在映射片段之外映射其他属性名称,如您已经发现的那样。当然,如果你在一个单独的声明中这样做,那就更清楚了:
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");