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

时间:2015-05-21 09:56:29

标签: c# .net entity-framework

我试图按照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会生成一个不存在的表?

由于

1 个答案:

答案 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");