2013-03-27 91 views
0

「電影」表ASP EF模型設計策略

public int movieId { get; set; } 
public String movieName { get; set; } 
public virtual Genres Genres { get; set; } 

「流派」表

public int genreId { get; set; } 
public String genreName { get; set; } 

我所尋找的是一個戰略,以建立模型來完成以下情形:

  1. 管理員輸入所有流派名稱,不再需要添加以後

  2. 非管理員進入電影和同一個屏幕上提供的所有「管理類型的」流派名稱

我的問題是,當他們創造一個電影,LINQ也想要一個下拉列表創建一個新的流派記錄

我不想創建任何類型更多的記錄,我只是想表看了看爲體裁列表

有什麼建議?

回答

2

我會改變屬性名稱和類名,使其更具可讀性。如果您將Genre表的主鍵列名稱保留爲GenreId,EF Codefirst將創建名稱爲Genre_GenreId !!的外鍵(在電影中)。所以我改變電影類簡單地ID的主鍵列名,因此,它會生成外鍵列Genre_ID

public class Movie 
{ 
    public int ID { get; set; } 
    public String MovieName { get; set; } 
    public virtual Genre Genres { get; set; } 
} 
public class Genre 
{ 
    public int ID { get; set; } 
    public String Name { get; set; } 
} 

現在,在你的用戶界面,你給一個下拉列表,它裏面列出了Avaialble Genre記錄。當用戶提交表單,將它保存這樣

using (YourDBContext dbContext = new YourDBContext()) 
{ 
    Movie movie= new Movie { MovieName = "Read it from UI Please" }; 
    var genr=dbContext.Find(2); 
    // TO DO : replace 2 by selected value from dropdown in the UI 
    movie.Genres =genr; 

    dbContext.Movies.Add(movie); 
    dbContext.SaveChanges();  
} 

您從您的分貝範圍內首次加載類別對象,並設置爲新的電影對象的Genres財產。我們使用Find方法來查找主鍵是傳遞給該函數的值的項目(在本例中爲2)。這將添加一個新的記錄電影臺,並設置GenreID列值作爲2,假設你在你的流派表

+0

澄清:「movie.Genres = new Genre {ID = 2};」是創建一個新的對象發送到流派風格,因爲流派是另一個表的對象? – user2182715 2013-03-27 14:58:02

+0

我不能讓它添加電影,除非我把:movie.Genres = new Genre {ID = 2,Name =「whatever」};然後創建一個新的流派記錄 – user2182715 2013-03-27 16:59:57

+0

我試着只設置ID,數據庫不會將它放在SaveChanges .....我添加了名稱以查看它的需求,就是這樣。 – user2182715 2013-03-27 18:26:24

0

這是沒有意義的,當你創建一個新的Movie創建一個新的Genre有ID 2的記錄,插入Movie時可能會出錯。下面是關於如何使用EF和MVC的技巧:

// Model with foreign key 
public class Movie { 
    public int MovieId { get; set; } 
    public string Name { get; set; } 
    public Genre Genre { get; set; } 
    public int GenreId { get; set; } 
} 

public class Genre { 
    public int GenreId { get; set; } 
    public string Name { get; set; } 
} 

// Movie Controller setting the genres for the view 
public ViewResult Create() { 
    // ... 
    var genres = repository.Genres.All(); 
    ViewBag.GenreId = genres; 
} 

// View 
@Html.DropDown("GenreId") 


// Movie controller, GenreId on the model will be 
// automatically populated via model binding and the 
// correct genre will be inserted 
[HttpPost] 
public ActionResult Create(Movie movie) 
{ 
    if (ModelState.IsValid) 
    { 
     repository.Movies.Add(movie); 
     repository.SaveChanges(); 
     // ... 
    } 
} 

祝你好運。

+0

您添加了「public int GenreId {get; set;}」....這對「流派風格」電影屬性有什麼影響?流派仍然是必需的財產嗎? – user2182715 2013-03-27 17:40:48

+0

效果是,當在視圖中填充GenreId時(使用下拉菜單),那麼模型綁定會填充'movie.GenreId'屬性,並且您可以使用EF **插入該值,而不會將**關聯到一個'Genre'對象到'電影'對象,只有GenreId。 EF將'Movie'模型上的'GenreId'理解爲'Genre'設置的'ForeignKeyAttribute',並將其設置爲'GenreId'。 – 2013-03-27 18:45:19