TPT实体框架的多级继承

时间:2016-01-05 14:15:52

标签: c# entity-framework mapping

我有以下内容:

public class Entity<TKey> : IEntity
{              
    [System.Runtime.Serialization.DataMemberAttribute]
    public virtual TKey Id { get; set; }
    [System.Runtime.Serialization.DataMemberAttribute]
    public virtual StateEnum State { get; set; }}


 public class Party : Entity<int>
{
    public virtual int TypeId { get; set; }
    public virtual string MobileNo1 { get; set; }}


public class Person : Party
{
    public virtual int PartyId { get; set; }
    public virtual string Name { get; set; }}

我在sql Party表中包含以下列[Id,TypedId,MobileNo1] 和Person表包含以下列:[PartyId,Name]和PartyId是Party的Id的外键。

如何制作地图?我已经尝试了但是我没有达到任何目的。

修改

假设TKey是整数 PartyId是党的关键人物和外键的关键

我尝试为人制作地图

HasKey(p =&gt; p.PartyId);
        ToTable( “人”);

和派对

   HasKey(p => p.Id);
            ToTable("Party");

它不起作用,我在这种情况下如何制作地图?

编辑2:

我有以下

 public class Entity<TKey> : IEntity
    {              
        [System.Runtime.Serialization.DataMemberAttribute]
        public virtual TKey Id { get; set; }
        [System.Runtime.Serialization.DataMemberAttribute]
        public virtual StateEnum State { get; set; }}


     public class Person : Entity<int>
    {
        public virtual string FirstName{ get; set; }
        public virtual string LastName{ get; set; }
}


    public class Employee: Person 
    {
        public virtual int PersonId { get; set; }
        public virtual string CompanyName{ get; set; }
}

我有Person表包含[Id,FirstName,LastName] 我有Employee表包含[PersonId,FirstName,LastName]

- PersonId是person表的外键。 - 员工是一对一关系的人。 - 为了将来我可以添加学生实体,所以学生就是人

如何制作地图?

1 个答案:

答案 0 :(得分:1)

我认为你正试图做这样的事情:

public class Entity<TKey> : IEntity
{              
[System.Runtime.Serialization.DataMemberAttribute]
public TKey Id { get; set; }
[System.Runtime.Serialization.DataMemberAttribute]
public StateEnum State { get; set; }}


public class Party : Entity<int>
{
public int TypeId { get; set; }
public string MobileNo1 { get; set; }

public virtual Person Person {get; set;}
}


public class Person
{
public int PartyId { get; set; }
public string Name { get; set; }

public virtual Party Party {get; set;}
}

所以Person有一个聚会(如果它是可选的,你声明int?)并且Party继承自Entity。我还删除了许多可能没有意义的虚拟声明(如果我对其中一些错了,请纠正我)。 virtual关键字在实体框架中用于指示导航属性。因此,这些属性是与其他现有实体的“链接”。 (还假设PartyIdPerson)的主键。

我不确定这会因为TKey中的Party主键而有效(如果你自己声明没有主键,EF自动选择名称中带有“id”的属性)可以是一个不同的类型,来自Person的外键始终是int ...为什么不能将Id声明为int

编辑:1:1的关系

modelBuilder.Entity<Person>()
            .ToTable("Person")
            .HasKey(p => p.PartyId)
            .HasRequired(p => p.Party)
            .WithRequiredDependent(p => p.Person)
            .Map(pers => pers.MapKey("PartyId");

这通常应该有效。它基本上说人需要一个党,党需要一个人。因为Person有外键,所以它是依赖的。

您还需要在没有所有虚拟属性的情况下更新模型,并将虚拟属性添加到相应的实体(就像我发布的模型中那样)。虽然使用属性会更容易并且将流畅的api保留为这是为了这个:

public class Entity<TKey> : IEntity
{              
[System.Runtime.Serialization.DataMemberAttribute]
public TKey Id { get; set; }
[System.Runtime.Serialization.DataMemberAttribute]
public StateEnum State { get; set; }}


public class Party : Entity<int>
{
public int TypeId { get; set; }
public string MobileNo1 { get; set; }

public virtual Person Person {get; set;}
}


public class Person
{
[Key,ForeignKey("Party")]
public int PartyId { get; set; }
public string Name { get; set; }

public virtual Party Party {get; set;}
}