4

我已经为解决我的主键使用问题而苦苦挣扎了好几天。请有人帮我解决这个难题!!!

我正在使用带有 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 字段定义时,一切正常。但这在我们的例子中是不可能的,因为对于每个表,我们都有不同的主键字段名称。

我不知道方法和我错在哪里!请帮我!!!

4

1 回答 1

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");
于 2010-10-10T17:29:17.457 回答