繁体   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