Asp.net-Mvc-4
EF 5,更新對像給出“發生引用完整性約束違規”
在我的模型中,我有一堆域對象。現在我在嘗試更新使用者對象時遇到問題。User 與 Role 對像有外鍵關係。當我在不更改外鍵值(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為nullEF,則將 only 視為user.FkRoleId描述使用者和角色之間關係的屬性,並刪除導致異常的歧義。