无法在 create/update 上填写 'join table'
Unable to fill the 'join table' on create/update
问题:
我无法让 EF 添加条目到我的名为 RoleUser 的连接 table,包含列 UsersId 和 RolesName,当创建一个新的用户(见底部的错误 1)。
然后我尝试创建连接 class,但是没有救赎(参见底部的错误 2)。
我的设置:
我在 EF5 中使用 classes User
和 Role
:
创建了多对多关系(因此连接 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();
}
问题:
我无法让 EF 添加条目到我的名为 RoleUser 的连接 table,包含列 UsersId 和 RolesName,当创建一个新的用户(见底部的错误 1)。
然后我尝试创建连接 class,但是没有救赎(参见底部的错误 2)。
我的设置:
我在 EF5 中使用 classes User
和 Role
:
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();
}