4

我已經掙扎了好幾天,以解決主鍵使用問題。請有人幫我解決這個難題!實體框架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字段定義時,一切正常。但在我們的例子中這是不可能的,因爲對於每個表我們都有不同的主鍵字段名稱。

我不知道方式,我錯了!請幫幫我!!!

+0

嗯......我不記得有這個問題與CTP3。不幸的是,我還沒有機會使用CTP4。 – djskinner 2010-08-03 21:47:50

+0

Huyrua如何實現可能存在一些特殊性Repository patern - 程序集包含的實體被自動識別並添加到上下文中。 – 2010-08-04 04:44:44

回答

1

而不是使用MapSingleType,嘗試使用MapHierarchy並指定字段。

對於實例

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