我正与一些成员一起开发一个Asp.net项目。成员可以拥有一个或多个角色。每个单元的默认角色之一是管理员。 该模型是:
public class UnitRole
{
public int Id { get; set; }
public string Name { get; set; }
public ICollection<OrganizationUnit> Units { get; set; }
// Static function to retrieve the UnitAdmin role
public static UnitRole UnitAdmin()
{
UnitRole result = null;
using (ApplicationDbContext context = new ApplicationDbContext())
{
result = context.UnitRoles.SingleOrDefault(ur => ur.Name.Equals(UnitAdminLabel));
if (!result.IsNull())
context.Entry(result).State = EntityState.Detached;
}
return result;
}
}
UnitRole表中添加了一些默认角色,例如unit admin( UnitAdmin ),当创建新单元时,此角色会添加到单元的角色中。
public class OrganizationUnit
{
public int Id { get; set; }
public string Name { get; set; }
public ICollection<UnitRole> Roles { get; set; }
public ICollection<ApplicationUser> Members { get; set; }
}
当我想添加新单位时,我会这样做:
UnitRole adminRole = UnitRole.UnitAdmin();
var adminMember = _context
.Users
.Include(u => u.Units)
.Include(ur => ur.UnitRoles)
.SingleOrDefault(m => m.Id == unitViewModel.Admin.Id);
if (adminMember != null)
{
OrganizationUnit unit = new OrganizationUnit
{
Name = unitViewModel.Name
};
unit.Roles.Add(adminRole);
adminMember.UnitRoles.Add(adminRole);
adminMember.Units.Add(unit);
unit.Members.Add(adminMember);
try
{
_context.UnitRoles.Attach(adminRole); // <<==== Exception here
_context.Entry(adminRole).State = EntityState.Unchanged;
_context.OrganizationUnits.Add(unit);
_context.SaveChanges();
unitViewModel.Id = unit.Id;
}
catch (Exception ex)
{
string error = ex.Message;
}
不幸的是,当我创建2个单位并想要添加另一个单位时,会出现此消息的异常:
保存或接受更改失败,因为多个类型的实体具有相同的主键值。确保显式设置的主键值是唯一的。确保在数据库和Entity Framework模型中正确配置了数据库生成的主键。使用实体设计器进行数据库优先/模型优先配置。
我做错了什么?
更新 如果我不使用方法UnitRole.UnitAdmin()
并自行获取,则问题不会引发。