4

我已经挣扎了好几天,以解决主键使用问题。请有人帮我解决这个难题!实体框架CTP4在BaseEntity中的非标准主键名称用法

我正在使用实体框架与CTP4使用代码优先的方法。我为我的项目采用了由Huyrua see here发布的Repository模式。我非常喜欢这个模板,特别是CTP4的可能性。

对于实体定义,我们使用几个嵌套层。在最底层,我们有BaseEntity,包含一些通用的领域,这样的:

public abstract class BaseEntity: IEntityBase 
    { 
     public virtual Nullable<System.DateTime> InsertDate { get; set; } 
     public virtual Nullable<int> PK_InsertUserAccount { get; set; } 
     public virtual byte[] TimeStamp { get; set; } 
    } 

然后我们从这个类派生为我们的具体的实体,例如:

public class Person : BaseEntity 
    { 
     public virtual int PK_Person { get; set; } 
     public virtual byte PersType { get; set; } 
     public virtual string eMail { get; set; } 
     public virtual string Name { get; set; } 
    } 

注意!我们有一个关键区别 - 数据库表主键名称不是“Id”!我们正在使用模式PK_。出于这个原因,我们不在BaseEntity中包含PK字段定义。此外,我们使用使用EntityConfiguration映射我们不按约定主键:

public class PersonMapping : EntityConfiguration<Person> 
    { 
     public PersonMapping() 
     { 
      this.HasKey(p => p.PK_Person); 
      this.Property(p => p.PK_Person).IsIdentity(); 
      this.MapSingleType().ToTable("dbo.Person"); //otherwise by convention it is converted to "People" 
     } 
    } 

在这里,我们有问题。当我尝试使用Person实体时,出现错误'无法推断实体类型'KDC.Model.Entities.BaseEntity''的密钥。 似乎ObjectContext需要在基类中定义主键。因为,当为了实验目的我移动BaseEntity中的PK字段定义时,一切正常。但在我们的例子中这是不可能的,因为对于每个表我们都有不同的主键字段名称。

我不知道方式,我错了!请帮帮我!!!

+0

嗯......我不记得有这个问题与CTP3。不幸的是,我还没有机会使用CTP4。 – djskinner 2010-08-03 21:47:50

+0

Huyrua如何实现可能存在一些特殊性Repository patern - 程序集包含的实体被自动识别并添加到上下文中。 – 2010-08-04 04:44:44

回答

1

而不是使用MapSingleType,尝试使用MapHierarchy并指定字段。

对于实例

modelBuilder.Entity<Person>().MapHierarchy(p => new { p.PK_Person, p.PersType, p.Name, p.eMail, p.InsertDate, p.PK_InsertUserAccount, p.TimeStamp}).ToTable("Persons");