2011-09-29 45 views
0

我正在针对现有的数据库进行开发,将我的抽象类映射为TPT,从而引发错误,指出“无效列名”ID“”。抽象类(带有现有表的TPT)的列映射

简单类如下

public abstract class Member 
{ 
    [DisplayName("ID")] 
    public string ID { get; set; } 

    [DisplayName("Date Applied")] 
    public System.DateTime? DateApplied { get; set; } 

    [DisplayName("Date Membered")] 
    public System.DateTime? DateMembered { get; set; } 

    [DisplayName("Member Type")] 
    public int MemberTypeFlag { get; set; } 

} 


public class Person : Member 
{ 
    [DisplayName("Last Name")] 
    public string LastName { get; set; } 

    [DisplayName("First Name")] 
    public string FirstName { get; set; } 

    [DisplayName("Date Of Birth")] 
    public System.DateTime DateOfBirth { get; set; } 
} 

,并映射到我的自定义表如下

public class MapMember : EntityTypeConfiguration<Member> 
{ 
    public MapMember() 
     : base() 
    { 
     HasKey(b => b.ID).Property(b => b.ID).HasColumnName("ID"); 
     Property(b => b.DateApplied).HasColumnName("DTM_APPLIED"); 
     Property(b => b.DateMembered).HasColumnName("DTM_MEMBERED"); 
     Property(b => b.MemberTypeFlag).HasColumnName("MBR_TYPE_FLG"); 
     ToTable("MBR"); 
    } 
} 

public class MapPerson : EntityTypeConfiguration<Person> 
{ 
    public MapPerson() 
     : base() 
    { 
     Property(p => p.LastName).HasColumnName("LNAME"); 
     Property(p => p.FirstName).HasColumnName("FNAME"); 
     Property(p => p.DateOfBirth).HasColumnName("DOB"); 
     Property(p => p.FirstName).HasColumnName("FNAME"); 
     ToTable("MBR_PERSON"); 
    } 
} 

但是无效的列名 “ID” 后db.savechanges提出()。

请指教。

感谢

回答

1

如果您MBR_PERSON表的主键列(必须是在同一时间外键MBR表)没有列名ID(该键的名称将会出现此错误表MBR中的列)。在TPT映射中,抽象实体的根表的主键列必须与派生实体的表的主键列具有相同的名称。

+0

感谢您指出这一点,一直在想这几天。对于这样的事情,是否会有DOs和Donts的任何链接。 – roggss

+0

@roggss:我不知道一个关于这个的真正全面的资源(绝对不是关于这个Donts)。但是,这一点实际上是EF Code-First的配置选项中的一个漏洞,因为您无法配置派生实体的表的键列名称。由于这种限制,我不止一次看到人们在创建与现有数据库的TPT映射时遇到问题。 – Slauma

+0

非常感谢你。你真的帮了我很多。 – roggss

相关问题