在EF 6

时间:2018-06-02 09:56:16

标签: c# entity-framework save

我正与一些成员一起开发一个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()并自行获取,则问题不会引发。

0 个答案:

没有答案