1

我建立一個應用程序周圍的遊戲旋轉和我保持2種動作的名單在我的遊戲對象:MVC modelbuilding:在表的多個外鍵,代碼首先EF

public class Game 
{ 
    public int Id {get;set;} 

    List<Action> ActiveActionList {get;set} 
    List<Action> PassiveActionList {get;set;} 
    ... (several other variables) 
} 

public class Action 
{ 
    public int Id {get;set;} 
    Game Game {get;set;} 
    ...(several other variables) 
} 

的這裏的想法是,一個動作或者是在被動或主動的ActionList(從來沒有在兩者),我把在行動上的一側爲基準爲好,使之與行動的工作時,我可以這樣說:

if (currentAction.Game.Id == someVariable) 
... 

我遇到的問題是,當我看向所創建的數據庫。 「操作」表中有所有正常的變量我的預期,但對於遊戲對象引用它顯示下列:

  • Game_Id
  • Game_Id1
  • Game_Id2

我猜測我應該在DbContext中的模型構建器重寫中做一些事情,以確保只有1列引用Game_Id。

我試着使用:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Actie>().HasRequired<Spel>(s => s.Spel).WithMany(a => a.Actielijst).HasForeignKey(a => a.Spel).WillCascadeOnDelete(false); 
     base.OnModelCreating(modelBuilder); 
    } 

基於此崗位(Entity Framework 4.1 InverseProperty Attribute and ForeignKey),但現在我得到另一個錯誤:

國外關鍵部件「遊戲」是不是一個聲明的屬性在類型'行動'上。驗證它沒有被明確地從模型中排除,並且它是一個有效的基本屬性。

我不知道如何,因爲我希望我只是用在上面的模型構建器錯誤的配置解決這個問題,所以我希望這裏有人能指出我吧:)

回答

1

一些更多的研究,我發現後這是根本不可能有多個列表中的一個對象是指在填充列表中的objectype一個鍵。處理這個問題的方法是使用如下所示的DataAnnotation'InverseProperty':https://stackoverflow.com/a/25366822/3191144

這意味着需要爲每個要保留的列表擁有一個引用對象。對於我來說,我必須做到以下幾點:

public class Game 
{ 
    public int Id {get;set;} 

    [InverseProperty("Game")] 
    List<Action> ActiveActionList {get;set;} 
    [InverseProperty("PassiveGame")] 
    List<Action> PassiveActionList {get;set;} 
    ... (several other variables) 
} 

public class Action 
{ 
    public int Id {get;set;} 
    Game Game {get;set;} 
    Game PassiveGame {get;set;} 
    ...(several other variables) 
} 

不幸的是,這也意味着我將有一個列,它是幾乎總是空(PassiveActions是罕見的比ActiveActions),但我想這是它的工作方式。對於兩個以上的列表,我認爲最好是更改體系結構或使用子類來避免加載列,以便簡單地跟蹤項目所在的列表。

如果有人找到一種方法來獲得1列在動作表爲紐帶,以遊戲和其它方法來跟蹤這兩個列表中,請不要回復:)