![](/img/trans.png)
[英]How to make one-to-many relationship between 3 entities work with Entity Framework Core 2.1 - code-first
[英]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,盡管事件信息是有效的。
最后,在一對多的關系中(如上所述),您如何使用日歷(一側)創建新事件(多側)? 我敢肯定這很簡單,而且我遺漏了一些東西,但我們將不勝感激。
/ * ** * ** * ** * ** * ** * /
這里有更多細節,我希望能澄清我的問題。
這就是我困惑的地方...
事件 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.