实体框架(5.0)代码优先 - 插入集合中的集合

时间:2012-11-21 10:14:51

标签: c# asp.net entity-framework code-first

我有三节课。

活动>工作坊>工作坊时间

我目前正在寻找将记录插入Workshop Times的最佳方法,这是首先使用ICollections运行代码。

寻找与此类似的东西,但我知道它不起作用:

       //Create connection
        var db = new Context();

        var Event = db.Events
            .Include("Workshops")
            .Include("Workshops.Times")
            .Where(ev => ev.GUID == EventGUID).FirstOrDefault();

        Event.Workshops.Add(new Workshop
        {
            Name = tbWorkshopName.Text,
            Description = tbWorkshopDescription.Text,
            Times.Add(new WorkshopTime{
                //Information for times
            })
        });

        db.SaveChanges();

砍下课程:

public class Workshops{
    public int id { get; set; }
    public string name { get; set; }
    public ICollection<WorkshopTimes> Times{get;set;}
}
public class Events {
    public int id { get; set; }
    public string name { get; set; }
    public ICollection<Workshops> WorkShops { get; set; }
}

public class WorkshopTimes {
    public int id { get; set; }
    public DateTime time { get; set; }
}

1 个答案:

答案 0 :(得分:0)

您的查询肯定在正确的轨道上,但您的包含语句似乎不正确。从我的模型中我可以期待:

    var Event = db.Events
        .Include("WorkShops")
        .Include("WorkShops.events")
        .Where(ev => ev.GUID == EventGUID).FirstOrDefault();

请注意,这使用属性名称而不是类型。这将确保列出的导航属性中的实体将包含在结果中。

此外,你可以使用lambda来做同样的事情(但是它的类型安全)

请查看此处了解如何与您的情况完全相同:

EF Code First - Include(x => x.Properties.Entity) a 1 : Many association

或者来自罗文米勒(来自EF团队)

http://romiller.com/2010/07/14/ef-ctp4-tips-tricks-include-with-lambda/

并确保基于lambda的包含(Where did the overload of DbQuery.Include() go that takes a lambda?

using System.Data.Entities