【问题标题】:Entity Framework Update nested list实体框架更新嵌套列表
【发布时间】:2016-12-12 00:06:43
【问题描述】:

我使用实体框架 6(代码优先)。我有一堂课:

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记录的外键还是Null:

我在网上尝试了很多方法,如下所示,但都没有成功:

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

有谁知道如何使用实体框架(6)将内部对象(如列表)保存在数据库中?

【问题讨论】:

  • 以上代码没有说明DialogSession DialogUser.Id之间的关系

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


【解决方案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中如何正确配置这种关系的例子。

【讨论】:

    【解决方案2】:

    如果我没记错你应该补充

    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();
    

    试一试:)

    【讨论】:

    • 是的,因为@ja
    • 无法编辑我的评论 -.- 但是是的,因为 @Jacob 在他的回答中解释了什么
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      以下内容对我有用。

      using System.ComponentModel.DataAnnotations;
      
      public class DialogSession
      {
          [Key]
          public int DialogSessionId { get; set; }
          public int DialogUser { get; set; }
      }
      
      public class DialogUser
      {
          [Key]
          public int DialogUserId { get; set; }
          public virtual ICollection<DialogSession> DialogSessions { get; set; }
      }
      

      【讨论】:

      • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-27
      相关资源
      最近更新 更多