实体框架更新嵌套列表

时间:2016-12-12 00:06:44

标签: c# entity-framework entity-framework-6

我使用Entity Framework 6(Code First)。我有一节课:

public class DialogSession {...}

另一个包含DialogSession个对象列表的类:

public class DialogUser
{
    public int Id { get; set; }
    public List<DialogSession> DialogSessions { get; set; }
}

我将DialogSession对象添加到列表中,然后执行context.SaveChanges(),如下所示:

dialogUser.DialogSessions.Add(dialogSession);
context.SaveChanges();

但是dialogSession记录的外键仍然是空的:

enter image description here

我尝试在网络上使用多种方法,如下所示,但取得了成功:

context.DialogUsers.Attach(dialogUser);
context.Entry(dialogUser).State = EntityState.Modified;
context.SaveChangesExtention();

有没有人知道如何使用Entity Framework(6)在数据库中保存内部对象(如列表)?

3 个答案:

答案 0 :(得分:1)

从你的问题不清楚你有哪种关系类型,所以我猜你有一对多,这样的事情应该有效:

public class DialogSession
{
    public int DialogSessionId { get; set; }
    public virtual DialogUser DialogUser { get; set; }
}

public class DialogUser
{
    public int DialogUserId { get; set; }
    public virtual ICollection<DialogSession> DialogSessions { get; set; }
}

请看一下示例如何在此article中正确配置此类关系。

答案 1 :(得分:0)

如果我没错,你应该添加

dialogUser.DialogSessions.Add(dialogSession);
context.Entry(dialogUser).State = EntityState.Modified; 
context.SaveChanges();

这会将实体标记为已修改,然后更改应反映在数据库中。

通过将奇异属性标记为已修改

,可以更有效地完成此操作
dialogUser.DialogSessions.Add(dialogSession);
context.Entry(dialogUser).Property(u => u.dialogSession).IsModified = true; 
context.SaveChanges();

试一试:)

答案 2 :(得分:0)

请参阅:https://msdn.microsoft.com/en-us/library/jj591583(v=vs.113).aspx

您应该为子实体使用虚拟列表,并确保DialogSessions类还使用DialogUserId属性(按约定命名)返回其父级