为什么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()的工作?

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

谢谢

为什么MapInheritedProperties()将我的实体映射到两个表

这是因为你放在一个映射片段

Map(m => { ... })

…映射到片段应用的表。事实上,它说:映射所有属性从Agent和属性NumberSubsriber到表"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");