我已经挣扎了好几天,以解决主键使用问题。请有人帮我解决这个难题!实体框架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字段定义时,一切正常。但在我们的例子中这是不可能的,因为对于每个表我们都有不同的主键字段名称。
我不知道方式,我错了!请帮帮我!!!
嗯......我不记得有这个问题与CTP3。不幸的是,我还没有机会使用CTP4。 – djskinner 2010-08-03 21:47:50
Huyrua如何实现可能存在一些特殊性Repository patern - 程序集包含的实体被自动识别并添加到上下文中。 – 2010-08-04 04:44:44