Asp.net mvc 3 具有抽象类的列映射(具有现有表的TPT)
我正在针对现有数据库进行开发,在将抽象类映射到作为TPT的表时遇到问题,这导致出现一个错误,称为“无效列名”ID“ 下面是一个简单的类Asp.net mvc 3 具有抽象类的列映射(具有现有表的TPT),asp.net-mvc-3,entity-framework-4,ef-code-first,Asp.net Mvc 3,Entity Framework 4,Ef Code First,我正在针对现有数据库进行开发,在将抽象类映射到作为TPT的表时遇到问题,这导致出现一个错误,称为“无效列名”ID“ 下面是一个简单的类 public abstract class Member { [DisplayName("ID")] public string ID { get; set; } [DisplayName("Date Applied")] public System.DateTime? DateApplied { get; set; }
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");
}
}
并映射到我的自定义表,如下所示
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");
}
}
公共类映射成员:EntityTypeConfiguration
{
公共映射成员()
:base()
{
HasKey(b=>b.ID).Property(b=>b.ID).HasColumnName(“ID”);
属性(b=>b.DateApplied).HasColumnName(“DTM_APPLIED”);
属性(b=>b.DateMembered);
属性(b=>b.MemberTypeFlag);
ToTable(“MBR”);
}
}
公共类MapPerson:EntityTypeConfiguration
{
公众人士()
:base()
{
属性(p=>p.LastName);
属性(p=>p.FirstName).HasColumnName(“FNAME”);
属性(p=>p.DateOfBirth)。具有ColumnName(“DOB”);
属性(p=>p.FirstName).HasColumnName(“FNAME”);
ToTable(“MBR_人”);
}
}
但是,在db.savechanges()上引发的列名“ID”无效
请告知
感谢如果
MBR\u PERSON
表中的主键列(必须同时是MBR
表的外键)没有列名ID
(表MBR
中的键列名称),则会发生此错误。在TPT映射中,抽象实体的根表的主键列必须与派生实体的表的主键列具有相同的名称。感谢您指出这一点,我们已经考虑了几天了。对于这样的事情,是否会有任何关于“做”和“不做”的链接。@罗格斯:我不知道关于这方面的真正全面的资源(绝对不是关于“不做”的)。但这一点实际上是EF Code First配置选项中的一个漏洞,因为您无法为派生实体的表配置键列名。我不止一次地看到,由于这个限制,人们在使用现有数据库创建TPT映射时遇到了问题。非常感谢,。你真的帮了我很多。