在我的模型中,我有一堆域对象。现在我在尝试更新用户对象时遇到问题。用户与角色对象具有外键关系。当我更新用户对象而不更改外键值(FkRoleId)时,一切正常。但是当我更改当前用户的角色时我想更新我收到错误:
发生参照完整性约束违规:属性
定义参考约束的值不一致
关系中的主要对象和从属对象之间。
以下是我更新用户对象的方法:
public void Update(User user)
{
using (var context = new DBEntities())
{
context.Entry(user).State = System.Data.EntityState.Modified;
context.SaveChanges();
}
}
如何更新我的用户对象而不出现此异常?
必须有一种方法可以更改外键值,以便将用户映射到另一个角色。
在这种情况下,这是我的域类:
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; }
}
引用您的评论:
然而;如果我将导航属性 user.Role 设置为 null 它可以工作
正好。但是,这是推荐的工作方式吗?
是的,在这种情况下确实如此。
您必须记住,您进入带有分离对象的新上下文user
(包括参考user.Role
)。通过将状态设置为Modified
您附加该对象user
连同相关的user.Role
到这个新的背景。
因为您正在使用外键关联 - 这意味着外键由属性表示FkRoleId
在模型类中 - 通过两种方式描述关系: 通过导航属性user.Role
并由标量性质user.FkRoleId
。如果这些不一致 - 即user.Role.PkId != user.FkRoleId
- EF 不知道哪一个描述了正确的关系并抛出您遇到的异常。
如果你设置user.Role
to null
EF 将考虑user.FkRoleId
单独作为描述用户和角色之间关系的属性以及导致异常的歧义被删除。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)