【问题标题】:EntityFramework adding new object to nested object collectionEntityFramework 将新对象添加到嵌套对象集合
【发布时间】:2013-01-11 06:59:56
【问题描述】:

这个问题是以下问题的延续:

EntityFramework adding new object to a collection

现在我明白了,使用 DbSet EF 时不会将整个集合加载到内存中

但是如果我有类似以下代码的内容:

public class User
{
    public int UserID { get; set; }
    public string UserName { get; set; }
    public ICollection<Role> Roles { get; set; }
}

public class Role
{
    public int RoleID { get; set; }
    public string RoleName { get; set; }
    public User User { get; set; }
}

public class MyContext : DbContext
{
    public DbSet<User> Users { get; set; }
    public DbSet<Role> Roles { get; set; }
}

public class SomeClass
{
    public void AssignRoleToUser(int userID, Role role)
    {
        var ctx = new MyContext();
        var user = ctx.Users.First(x => x.UserID.Equals(userID));

        user.Roles.Add(role);

        ctx.SaveChanges();
    }
}

在这种情况下,我没有使用 DbSet 对象向 Role 集合添加新对象,而是使用 @ 向特定用户添加新角色987654325@收藏

那么在这种情况下会发生什么?

EntityFramewrk 是否必须将所有用户角色加载到内存中才能执行插入操作?

【问题讨论】:

  • 在这个提供的代码中,上面你没有添加新角色,因为你的 ctx.Users 只是用来检索数据。

标签: c# entity-framework


【解决方案1】:

在上面提供的代码中,您没有添加新角色,因为您的 ctx.Users 仅用于检索数据。这篇 SE 帖子 - Linq To Entities - how to filter on child entities 解决了一些类似的问题。

我建议您看看这篇简短而有用的文章 - Entity Framework 4.0 FAQ – Getting Started Guide。

【讨论】:

    【解决方案2】:

    没有。 EF 不需要知道用户拥有什么“角色”。 您需要了解变更跟踪会发生什么:

    1. 一旦运行查询,更改跟踪器就会收到“用户”的对象条目。此用户的状态为“未更改”

    2. 您将新角色添加到用户的角色集合中。这只是为这个新角色添加一个更改跟踪器条目并将其标记为“已添加”

    3. 在 SaveChanges() 上,EF 将查看您的更改跟踪器并查看用户对象没有更改,因此无需在此处进行任何操作。新角色还有一个条目,指出需要添加它。因此将编写一个 SQL 查询来插入此角色。

    就这么简单。您始终可以调试并添加监视更改跟踪器的状态。可以通过调用 DbContext.ChangeTracker.Entries() 找到条目。

    EF 会盲目地将“添加”发送到数据库。

    【讨论】:

      猜你喜欢
      • 2021-10-06
      • 1970-01-01
      • 2023-01-12
      • 1970-01-01
      • 2014-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多