无法在 create/update 上填写 'join table'

Unable to fill the 'join table' on create/update

问题:
我无法让 EF 添加条目到我的名为 RoleUser 的连接 table,包含列 UsersIdRolesName,当创建一个新的用户(见底部的错误 1)。
然后我尝试创建连接 class,但是没有救赎(参见底部的错误 2)。

我的设置:
我在 EF5 中使用 classes UserRole:

创建了多对多关系(因此连接 class 应该过时了)
public class User
{
    public int Id { get; set; }
    public string Username { get; set; }
    public ICollection<Role> Roles { get; set; }
}

public class Role
{
    [Key]
    public string Name { get; set; }
    public ICollection<User> Users { get; set; }
}

错误 2 的联接 table:

[Table("RoleUser")]
public class RoleUserRelation
{
    [ForeignKey("UsersId")]
    public int UsersId { get; set; }

    [ForeignKey("RolesName")]
    public string RolesName { get; set; }
}

使用非常基本的 DbContext:

public class UserContext : DbContext
    {
        public DbSet<User> Users { get; set; }
        public DbSet<Role> Roles { get; set; }
        //public DbSet<RoleUserRelation> RoleUserRelations { get; set; } <-- Error 2

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            // modelBuilder.Entity<RoleUserRelation>().HasNoKey(); <-- Error 2
        }
    }

✔ 当我尝试执行 GET 时,它有效(向用户显示其角色):

[HttpGet]
public async Task<IActionResult> Get()
{
    var users = await _context.Users.Include(a => a.Roles).ToListAsync();

    return Ok(users);
}

❌ 创建失败:

    [HttpPost]
    public IActionResult Create(User user)
    {
        _context.Add(user);
        _context.SaveChanges();

        return Ok();
    }

错误:
错误 1:

SqlException: Violation of PRIMARY KEY constraint 'PK_Roles'. Cannot insert duplicate key in object 'dbo.Roles'. The duplicate key value is (Basic).

错误 2:

Cannot use table 'RoleUser' for entity type 'RoleUser (Dictionary<string, object>)' since it is being used for entity type 'RoleUserRelation' and potentially other entity types, but there is no linking relationship. Add a foreign key to 'RoleUser (Dictionary<string, object>)' on the primary key properties and pointing to the primary key on another entity typed mapped to 'RoleUser'.

期望的结果:

不尝试插入角色(它首先让他们在那里)但添加用户为每个角色添加一行到联接 table.

我不是 100% 确定这一点,但我认为当您将实体(用户)附加到上下文时,EF 也会附加与父实体处于相同状态的任何子实体(角色)。如果您认为该角色已经存在,您应该能够将每个角色的实体状态从 'Added' 更改为 'Unchanged':

public IActionResult Create(User user)
{
    _context.Add(user);

    foreach (var role in user.Roles)
        _context.Entry(role).State = EntityState.Unchanged;

    _context.SaveChanges();

    return Ok();
}