2011-08-09 55 views
3

我敢肯定,這是非常直接的,但是,在網絡沖刷後,我找不到任何東西來讓我直觀。使用MVC 3實體框架代碼 - 首先,如何在一對多關係中創建新的「多」對象?

我正在使用ASP.NET MVC 3與實體框架代碼優先建模。

我在日曆和事件之間有一個簡單的一對多關係(對於每個日曆可以有0個或多個事件)。

簡而言之,我很困惑如何創建/插入與日曆關聯的新事件。

我的實體域的定義是:

public class Calendar 
{ 
    [Key] 
    public long id { get; set; } 
    public string title { get; set; } 
    public string description { get; set; } 
    public virtual ICollection<Event> events { get; set; } 
} //class 

public class Event 
{ 
    [Key] 
    public long id { get; set; }   
    public string title { get; set; } 
    public string description { get; set; } 
    public DateTime startdate { get; set; } 
    public DateTime enddate { get; set; } 
    public int importance { get; set; } 
} //class 

我創建了一個頁面有鏈接到「創建新事件」是通過日曆ID名爲創建CalendarController動作(/本地主機:XXXXX /日曆/創建/ 1)。

對於代碼優先,我堅持這一點,我沒有calendar_id(或類似的東西)作爲Event類的指定成員,以將事件關聯到日曆。由於列由代碼優先引擎生成,因此在數據庫中存在。

我試着創建一個ViewModel,它結合了日曆ID和一個Event對象,但是,當我從Create.cshtml返回時,日曆ID從1重置爲0,儘管事件信息是有效的。

最後,在一對多的關係中(如上),你如何創建一個新的事件(多方)與日曆(一邊)?我相信這很簡單,我錯過了一些東西,但任何和所有的幫助將不勝感激。

/* ** * ** * ** * ** * ** */

這裏更詳細一點,我希望會爲我的問題添加說明。

  1. 用戶選擇一個日曆(calendar_id,假設它是1)。
  2. 在該特定日曆的詳細信息頁面上,存在指向控制器/操作(CalendarController/CreateEvent)的鏈接,以創建與該特定日曆關聯的新事件。 創建的路線是Calendar/CreateEvent/1(爲id = 1的日曆創建新事件)。
  3. 在CreateEvent操作中,我現在擁有新事件的日曆實例的ID。

這是我弄糊塗......

爲由代碼優先引擎創建的事件對象不具有CALENDAR_ID數據成員,所以我沒有什麼可分配到達的CALENDAR_ID在路線數據中。

我知道這是一個標準的情況,但我錯過了一些東西。我需要保持calendar_id到[HttpPost] CreateEvent。從那裏,我可以簡單地找到適當的日曆(使用calendar_id),從新的Event窗體(在CreateEvent.cshtml中)獲取信息來創建一個新事件,並簡單地調用Calendar.Add(newEvent)。

如何保持在整個GET /表格/ POST週期CALENDAR_ID(或爲此事日曆)?再次

感謝您的幫助。

/* ** * ** * ** * ** * ** */ 我重新試圖下面提到添加虛擬的可能的解決方案日曆和CalendarId到Event類。我將接受的操作參數更改爲HttpGet和HttpPost函數的Event對象。在HttpGet函數中,我將CalendarId設置爲將添加新事件的日曆的CalendarId(如上所示,id == 1)。在CreateEvent視圖中一切正常,但是,在返回到CreateEvent的HttpPost動作時,CalendarId被重置爲0.

我仍然錯過了一些東西......但是,感謝您的幫助,米仍在尋找那個火花。

回答

2

花一些時間來重新考慮我的問題後,做更多的研究,我發現以下信息和解決方案。

首先,一個很好的教程(有點長,但有很多很好的細節),請訪問: http://www.asp.net/entity-framework/tutorials/creating-an-entity-framework-data-model-for-an-asp-net-mvc-application

本教程不深入,也沒有用,和IOC,然而,這些概念對於實體框架和代碼的第一個想法是非常有用的。

至於我的解決方案,我做了兩兩件事:1。 按照上面的教程,我添加了兩個字段我的事件類。我添加了「long time_id」和「虛擬日曆日曆」屬性。這給了我一個將timeline_id傳遞到CreateEvent控制器操作的地方。虛擬日曆屬性將導航屬性提供回日曆表。 2.我選擇在CreateCalendar cshtml表單中使用隱藏字段來創建新事件。這允許timeline_id存儲在表單中,然後返回到CreateEvent操作的HttpPost實例。

這解決了我的問題,但是,如果有人有一個更好的解決方案,請讓我知道。

2

我通常會這麼做,因爲我比較熟悉數據庫表結構通常應該與EF Code First語法應該是什麼樣的表設置我的表,然後使用EF Power Tools對錶進行逆向工程納入POCO和映射。

Reverse http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-68-19-metablogapi/3618.ProjectMenu_5F00_thumb_5F00_2E36D883.png

至於你的實體爲什麼不Calendar屬性只是添加到您的Event

public class Event 
{ 
    [Key] 
    public long id { get; set; }   
    public string title { get; set; } 
    public string description { get; set; } 
    public DateTime startdate { get; set; } 
    public DateTime enddate { get; set; } 
    public int importance { get; set; } 

    public virtual Calendar Calendar { get; set; } 
    public int CalendarId { get; set; } 
} //class 
+0

謝謝。下一次我會記住這一點(它實際上聽起來很有趣),但是,我已經掌握了一切,我知道我只是想念一些愚蠢的東西,我想知道它是什麼。 – Billbris

+0

關於你最後的問題,(爲什麼不添加日曆...)。代碼優先引擎抱怨說,當我這樣做時,我有兩個CalendarId。衝突是由我手動輸入的CalendarId以及由代碼優先引擎生成的CalendarId造成的。 – Billbris

相關問題