簡體   English   中英

使用 MVC 3 Entity Framework Code-First,如何以一對多的關系創建一個新的“多”object?

[英]Using MVC 3 Entity Framework Code-First, how do you create a new “many” object in a one-to-many relationship?

我確信這是非常直截了當的,但是,在搜尋網后,我找不到任何可以讓我直截了當的東西。

我將 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 傳遞給名為 Create (/localhost:xxxxx/Calendar/Create/1) 的 CalendarController 操作。

我被困在這一點上,就像代碼優先一樣,我沒有 calendar_id(或類似的東西)作為事件 class 的指定成員來將事件關聯到日歷。 這確實存在於數據庫中,因為該列是由代碼優先引擎生成的。

我嘗試創建一個結合日歷 ID 和事件 object 的 ViewModel,但是,當我從 Create.cshtml 返回時,日歷 ID 從 1 重置為 0,盡管事件信息是有效的。

最后,在一對多的關系中(如上所述),您如何使用日歷(一側)創建新事件(多側)? 我敢肯定這很簡單,而且我遺漏了一些東西,但我們將不勝感激。

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

這里有更多細節,我希望能澄清我的問題。

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

這就是我困惑的地方...

事件 object 沒有由代碼優先引擎創建的 calendar_id 數據成員,因此我無法分配到達路線數據的 calendar_id。

我知道這是一個標准情況,但我錯過了一些東西。 我需要將 calendar_id 保留到 [HttpPost]CreateEvent。 從那里,我可以簡單地找到合適的日歷(使用 calendar_id),從新事件表單(在 CreateEvent.cshtml 中)獲取信息來創建新事件,然后調用 Calendar.Add(newEvent)。

如何在整個 GET/form/POST 周期中保留 calendar_id(或日歷)?

再次感謝任何幫助。

/ * ** * ** * ** * ** * ** * / 我重新嘗試了下面提到的可能解決方案,將虛擬日歷和 CalendarId 添加到事件 class。 對於 HttpGet 和 HttpPost 函數,我將接受的操作參數更改為 Event object。 在 HttpGet function 中,我將 CalendarId 設置為要添加新事件的日歷(如上,id == 1)。 在 CreateEvent 視圖中一切正常,但是,在返回 CreateEvent 的 HttpPost 操作時,CalendarId 被重置為 0。

我仍然缺少一些東西......但感謝您的幫助,我仍在尋找那個火花。

我通常做的,因為我更熟悉數據庫表結構通常應該是什么樣子,而不是 EF Code First 語法應該是設置我的表,然后使用EF Power Tools將表逆向工程為 POCO和映射。

撤銷
(來源: msdn.com

至於您的實體,為什么不將Calendar屬性添加到您的Event 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; }

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

在花了一些時間重新考慮我的問題並進行更多研究之后,我發現了以下信息和解決方案。

首先,一個非常好的教程(有點長,但有很多很好的細節)可以在: http://www.asp.net/entity-framework/tutorials/creating-an-entity-framework-data-model-for -an-asp-net-mvc-應用程序

本教程沒有深入研究,也沒有使用 Ioc,但是,關於實體框架和代碼優先思想的概念非常有幫助。

至於我的解決方案,我做了兩件事: 1. 根據上面的教程,我在 Event class 中添加了兩個字段。 我添加了“long timeline_id”和“virtual Calendar calendar”屬性。 這給了我一個地方來保存傳遞給 CreateEvent controller 操作的時間線 ID。 並且虛擬日歷屬性提供返回日歷表的導航屬性。 2. 我選擇使用 CreateCalendar cshtml 表單中的隱藏字段來創建新事件。 這允許將timeline_id 存儲在表單中,然后返回到CreateEvent 操作的HttpPost 實例。

這解決了我的問題,但是,如果有人有更優雅的解決方案,請告訴我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM