我已經掙扎了好幾天,以解決主鍵使用問題。請有人幫我解決這個難題!實體框架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