2013-11-15 61 views
1

想象一下,我有一個由代碼創建的數據庫,看起來像這樣。代碼第一個實體框架和外鍵

Movie (table) 
ID int PK 
MoveiName nvarchar(100) 

Actor (table) 
ID int PK 
ActorName nvarchar(100) 
Movie_ID int FK 

這些是我會用到的模型,顯然不完全像這樣,但你會明白我的觀點。

class Movie 
{ 
    int ID{get;set;} 
    string MovieName {get;set;} 
    List<Actor> Actors {get;set} 
} 

class Actor 
{ 
    int ID{get;set} 
    string Actorname{get;set} 
    Movie Movie{get;set;} 
    int Move_ID{get;set;} 
} 

數據庫首先使我能夠從演員查詢電影,但也可以讓我設置演員的forgien鍵屬性來更新數據庫。我不能在代碼中做到這一點,因爲外鍵不是隻在模型中的對象。我寧願不要獲取Movie對象並設置屬性,如果我知道我的電影的id,我寧願只設置外鍵而不打電話來獲取電影。

有意義嗎?大聲笑

我想使用codefirst和實體的遷移,但我想要的數據庫相同的能力首先設置一個對象的外鍵。

乾杯的幫助:-D

+1

配置它「我不能在代碼首先做的原因是外鍵是不是模型」。這是代碼第一 - 將其添加到您的模型!一些開發人員不喜歡外鍵,有些是http://msdn.microsoft.com/en-us/magazine/hh708747.aspx – Colin

+0

我知道你可以將它添加到你的模型,但是然後遷移創建重複鍵 –

回答

7

首先改變你的代碼,這

public class Movie 
{ 
    int ID{ get; set; } 
    string MovieName {get; set; } 
    List<Actor> Actors {get; set; } 
} 

public class Actor 
{ 
    int ID{get;set} 
    string ActorName{ get; set } 
    Movie Movie{ get; set; } 
    int MovieID{ get; set; } 
} 

通過convention EF就知道MovieID是外鍵Movie

然後換Actor代碼這個:

public class Actor 
{ 
    int ID{get;set} 
    string ActorName{ get; set; } 
    Movie Movies{ get; set; } 
} 

演員出現在許多電影中。電影有很多演員.... :-)

但回到你一到那裏的許多演員只出現在一部電影 - 如果你真的想要的外鍵是Move_ID然後添加一個data annotation

[ForeignKey("Move_ID")] 
Movie Movie{ get; set; } 

或者使用FluentAPI

modelBuilder.Entity<Actor>() 
       .HasRequired(c => c.Movie) 
       .WithMany(d => d.Actors) 
       .HasForeignKey(c => c.Move_ID); 
+0

我應該提到這不是一個真正的scenerio,如果我想要一個電影數據庫,你是對的。演員可以在我喜歡額外想法的許多電影中。唯一的區別是_?我最近開始使用果園,而且我認爲這是在那裏召開的。 –

+0

不,您還必須將「我」放回「移動」部分才能將其轉換爲「MovieID」。或者,您可以在任何地方使用「ID」。這些都在我鏈接到的入門頁面中。請閱讀http://msdn.microsoft.com/en-us/data/ee712907 – Colin

+0

是一個敏感的靈魂,我可能會在您的回覆中讀到一些令人煩惱的東西,這些回覆可能存在也可能不存在。然而你的答案是現貨。我在沒有_的情況下將外鍵加回到我的模型上,並且它運行得非常出色。好人。 –

相關問題