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

Nik*_*ren 10 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

如何更新我的用户对象而不会出现此异常?必须有一种方法来修改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; }
}
Run Code Online (Sandbox Code Playgroud)

Sla*_*uma 29

引用你的评论:

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

是的,在这种情况下是.

您必须记住,您使用分离的对象user(包括对引用user.Role)输入新的上下文.通过设置状态,Modified您可以将对象user与相关的user.Role新上下文相关联.

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

如果设置user.RolenullEF,则将single user.FkRoleId单独作为描述用户和角色之间关系的属性,并删除导致异常的歧义.