2014-12-11 39 views
0

所以,我必須從另一個數據庫導入表。該表使用自己的密鑰進行自引用,但我無法相信該密鑰,特別是因爲我輸入的表將用於多個數據集。ASP樣板(EF) - 流利的API - 自參照表,不使用主鍵

我使用實體框架和代碼第一流利的API,但有一個時間開溜找到解決方法,這一問題。

這裏是我的POCO類(簡化爲只需要數據點):

public class Person 
{ 
    public virtual int Id { get; set; } 
    public virtual int personid { get; set; } 
    public virtual int? parentid { get; set; } 

    public virtual Person parent { get; set; } 
    public virtual ICollection<Person> children { get; set; } 
} 

這將是一個簡單的自我引用表,如果我可以使用ID,但我必須使用PERSONID。我已經設置了我需要的流暢api的想法,但是EF一直在尋找Id。

modelBuilder.Entity<Person>() 
    .HasOptional(p => p.parent) 
    .WithMany(p => p.children) 
    .HasForeignKey(p => p.parentid) 
    .WillCascadeOnDelete(false); 

使用personid作爲唯一約束(在EF6.1.2中尚未實現)填充集合的任何解決方法?

我也使用Asp.NetBoilerplate,所以在我的實體,倉庫等一些控制是可能的,但不推薦。即「Id」被假定爲任何和所有表的主鍵。

回答

0

嗯..

爲什麼不使用HasKey來定義id列?

modelBuilder.Entity<Person>() 
    .HasKey(p=> p.personId) 
    .HasOptional(p => p.parent) 
    .WithMany(p => p.children) 
    .HasForeignKey(p => p.parentid) 
    .WillCascadeOnDelete(false); 
+0

似乎並沒有得以順利。運行時,實體框架出錯,它正在查找Person_personid列,並且該列名稱不存在。我可以將表中的列重命名爲Person_personid,但是接下來我將不得不重構我的導入工具... – Salteris 2014-12-11 00:50:26

+0

hmm ..我只是用示例代碼對它進行了測試,似乎工作正常。使用您的樣品添加類的映射如上創造兩個人的父母和孩子,並沒有錯誤..一切都正確保存.. – amuz 2014-12-11 01:06:37

+0

OK,那麼這是一個ABP問題。我已將其轉發給創作者,以查看代碼中是否有任何內容來處理這種情況。 我會發布任何他可能會給的答案,謝謝。 – Salteris 2014-12-11 15:59:36