2012-03-06 33 views
0

我有以下問題:我不能得到2參考同一類/表

我有2類,我不想用代碼先生成一個數據庫。

public class Chart 
{ 
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public Guid Id { get; set; } 
    public State Initial { get; set; } 
    public virtual ICollection<State> States { get; set; } 
} 

public class State 
{ 
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public Guid Id { get; set; } 
    public string Name { get; set; } 
} 

我也想圖表類的初始屬性指向它的初始狀態。

但無論我嘗試我不會得到它的工作。我用數據說明,流暢的API和外鍵的屬性,但繼續運行到類似的問題:

「無法確定相關操作的有效順序依賴可能存在由於外鍵約束,模型要求,或store-生成的值「。

爲了使這更加interessting我也想初始狀態是圖表類的狀態之一。

有人可以幫我嗎?

UPDATE:

我發現了一塊拼圖:

代碼首先框架嘗試創建2個表。
圖表:與列 - >標識,Initial_Id
國:與列 - >號,姓名,於國表和Chart_Id

Chart.Initial_Id引用State.Chart_Id引用的圖表表。現在,這個級聯刪除或插入等時,介紹了圓形的問題...

嗯...

+0

我發現了以下解決方案:我將使圖表初始可選。然後我將保存圖表,設置初始狀態並再次保存。我知道這很醜陋,但這樣我就完成了這項工作。一層會掩蓋這種醜陋。 ;-) – Tim 2012-03-08 17:32:18

回答

0

這僅僅是一個在黑暗中拍攝,但你認爲它有事情做與事實這兩個類的屬性(大概是你想要的主鍵)有一個叫id的guid?如何將它重命名爲StateId和ChartId?如果不出意外,我認爲這只是更好的命名慣例......

全面披露:我不使用CF EF,但只是碰到這種偶然作爲一個有趣的帖子

+0

謝謝你的建議,但我認爲這不是問題。 id屬性將成爲2個不同表的列名。我認爲這是不好的命名練習,因爲id屬性只是2個不同類的屬性。將類名置於屬性名稱之前不會爲其添加任何值,只是因爲它是該特定類的屬性。就像將'name'屬性更改爲StateName不會爲其添加任何值一樣。這只是多餘的。 – Tim 2012-03-06 21:40:48

+0

也許,但如果這些被直接翻譯成表格,我可能在自動生成的查詢之外的上下文中引用的表格,我真的很希望能夠看到id的詳細含義。 (例如:選擇SomeObjectId FROM SomeObject所以加入SomeOtherObject洙so.SomeObjectId = soo.SomeOtherObjectId) 對不起我的想法並沒有幫助手頭的事情,雖然;) – Killnine 2012-03-06 22:07:23

+0

我看到你要去哪裏。但我認爲可以在每個列的前面添加一個表名來解決這個問題。對? – Tim 2012-03-06 22:42:12

0

EF目前還不能完全按照您寫入的方式執行此映射,因爲它最終會結合使用循環依賴項和數據庫生成的鍵,無法確定更新/插入順序。

但是,在行之間閱讀我將假設可能狀態實體應該在多個Chart實體之間共享。換句話說,多個圖表可以指向同一個州。在這種情況下,你真的是圖表和國家之間的許多一對多的關係,您可以覆蓋OnModelCreating方面告訴EF這一點:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Chart>() 
     .HasMany(s => s.States) 
     .WithMany(); 
} 

現在這樣的事情會工作:

using (var context = new ChartContext()) 
{ 
    var state1 = new State { Name = "State1" }; 
    var state2 = new State { Name = "State2" }; 

    var chart = 
     new Chart 
     { 
      Initial = state1, 
      States = new List<State> { state1, state2 } 
     }; 

    context.Charts.Add(chart); 
    context.SaveChanges(); 
} 

正如你可以看到,圖表現在有一個初始狀態和狀態的集合,初始狀態是狀態的集合中的一個。

如果實際上每個國家都與唯一一個圖表實體關聯,那麼您需要弄清楚其他一些方法 - 可能有解決方法來完成此工作,但不像上述解決方案那樣容易。