我几天来一直在努力解决主键使用问题。拜托,有人帮我解决这个难题!!!
我使用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字段定义,一切正常。但是在我们的情况下这是不可能的,因为对于每个表我们都有不同的主键字段名称。
我不知道我错了!拜托,帮帮我!!!
答案 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");