我已经为解决我的主键使用问题而苦苦挣扎了好几天。请有人帮我解决这个难题!!!
我正在使用带有 CTP4 的实体框架,使用 Code First 方法。我为我的项目采用了由 Huyrua 发布的存储库模式,请参见此处。我对这种模式非常满意,尤其是对 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 字段定义。此外,我们使用 useEntityConfiguration
来映射我们的非约定主键:
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 实体时,出现错误'Unable to infer a key for entity type 'KDC.Model.Entities.BaseEntity''。似乎 ObjectContext 需要在基类中定义主键。因为,当出于实验目的我在 BaseEntity 中移动 PK 字段定义时,一切正常。但这在我们的例子中是不可能的,因为对于每个表,我们都有不同的主键字段名称。
我不知道方法和我错在哪里!请帮我!!!