EF 5,更新对象给出“发生参照完整性约束违规”

时间:2013-01-17 09:57:14

标签: asp.net-mvc-4 entity-framework-5

在我的模型中,我有一堆域对象。现在我在尝试更新用户对象时遇到问题。用户与Role对象具有外键关系。当我更新User-object而不更改foreignkey值(FkRoleId)时,一切正常。但是,当我更改当前用户的角色时,我想要更新,我得到错误:

  

发生了参照完整性约束违规:属性   定义引用约束的值不一致   在关系中的主要和依赖对象之间。

以下是我更新用户对象的方法:

public void Update(User user)
{
    using (var context = new DBEntities())
    { 
    context.Entry(user).State = System.Data.EntityState.Modified;
    context.SaveChanges();
    }
}

如何更新我的用户对象而不会出现此异常? 必须有一种方法来修改foreignkey值,以便将用户mappen到另一个角色。

在这种情况下,这是我的域类:

public partial class User
{
public User()
{
    this.Advertisers = new HashSet<Advertiser>();
    this.Cases = new HashSet<Case>();
    this.Materials = new HashSet<Material>();
}

public int PkId { get; set; }
public int FkRoleId { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public string Password { get; set; }
public System.DateTime Created { get; set; }
public bool Active { get; set; }

public virtual ICollection<Advertiser> Advertisers { get; set; }
public virtual ICollection<Case> Cases { get; set; }
public virtual ICollection<Material> Materials { get; set; }
public virtual Role Role { get; set; }
}


public partial class Role
{
public Role()
{
    this.Users = new HashSet<User>();
}

public int PkId { get; set; }
public string Name { get; set; }
public string Description { get; set; }

public virtual ICollection<User> Users { get; set; }
}

1 个答案:

答案 0 :(得分:29)

引用你的评论:

  

然而;如果我将导航属性user.Role设置为null它可以工作   正好。但是,这是推荐的工作方式吗?

是的,在这种情况下是。

您必须记住,您输入了一个带有分离对象user的新上下文(包括对user.Role的引用)。通过将状态设置为Modified,您可以将对象user与相关的user.Role一起附加到此新上下文中。

因为您正在使用外键关联 - 这意味着外键由模型类中的属性FkRoleId表示 - 关系以两种方式描述:通过导航属性user.Role和标量属性user.FkRoleId。如果这些不一致 - 即user.Role.PkId != user.FkRoleId - EF不知道哪一个描述了正确的关系并抛出了你的异常。

如果将user.Role设置为null,EF会将user.FkRoleId单独视为描述用户和角色之间关系的属性,并且会删除导致异常的歧义。< / p>