2011-08-09 56 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

相关问题