EF Code First多对多关系 - 将重复记录插入数据库

时间:2013-02-05 09:19:32

标签: c# entity-framework ef-code-first

我有第三方服务,我从中获取了大量数据,我想将这些信息存储在我的本地数据库中。假设我的数据库中有3个表用户角色 UserRole

  1. 用户表包含以下字段 - UserId(PK),UserName。
  2. 角色表包含​​以下字段 - RoleId(PK),RoleName。
  3. UserRole表包含以下字段 - UserId(FK),RoleId(FK)。
  4. 因此,用户和角色表之间存在多对多关系。

    当我尝试将以下记录保存到数据库时,它会在角色表中生成重复记录。

    using (CFAContext context = new CFAContext())
    {
        context.Users.Add(new User { UserName = "User 1", Roles = new List<Role> { new Role { RoleName = "Role 1" }, new Role { RoleName = "Role 2" }, new Role { RoleName = "Role 3" } } });
        context.Users.Add(new User { UserName = "User 2", Roles = new List<Role> { new Role { RoleName = "Role 1" }, new Role { RoleName = "Role 2" } } });
        context.Users.Add(new User { UserName = "User 3", Roles = new List<Role> { new Role { RoleName = "Role 1" }, new Role { RoleName = "Role 4" } } });
        context.SaveChanges();
    }
    

    如何将此列表插入数据库(用户和角色),而用户角色表中没有任何重复记录?

3 个答案:

答案 0 :(得分:3)

我猜RoleId字段是唯一标识符,因此对于您添加的每个角色,当您创建新{{1}时,您将在数据库中获得具有不同RoleId字段的新记录实例。

如果您将代码更改为以下代码,它将起作用;

Role

答案 1 :(得分:0)

您正在使用名称“Role 1”创建3个角色,我将在角色表中创建此记录,并在需要将其分配给用户时进行检索。

答案 2 :(得分:0)

下面的代码会创建4个新角色。如果执行两次,db中将有8个角色。如果您不希望在其他执行中复制角色,则应从上下文中选择它们。

using (CFAContext context = new CFAContext())
{
    var roles = new List<Role> {
      new Role { RoleName = "Role 1" },
      new Role { RoleName = "Role 2" },
      new Role { RoleName = "Role 3" },
      new Role { RoleName = "Role 4" }
    };

    context.Users.Add(new User { UserName = "User 1", Roles = new List<Role> { roles[0], roles[1], roles[2] } });
    context.Users.Add(new User { UserName = "User 1", Roles = new List<Role> { roles[0], roles[1] } });
    context.Users.Add(new User { UserName = "User 1", Roles = new List<Role> { roles[0], roles[3] } });
    context.SaveChanges();
}

BTW你的RoleId怎么样?