实体框架CTP4在BaseEntity中使用非标准主键名称

时间:2010-08-03 11:16:44

标签: entity-framework primary-key repository-pattern code-first

我几天来一直在努力解决主键使用问题。拜托,有人帮我解决这个难题!!!

我使用Code First方法将实体框架与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字段定义。此外,我们使用use 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字段定义,一切正常。但是在我们的情况下这是不可能的,因为对于每个表我们都有不同的主键字段名称。

我不知道我错了!拜托,帮帮我!!!

1 个答案:

答案 0 :(得分:1)

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

例如

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