在我的模型中,我有一堆域对象。现在我在尝试更新用户对象时遇到问题。用户与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; }
}
答案 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>