Asp.net-Mvc-4

EF 5,更新對像給出“發生引用完整性約束違規”

  • September 10, 2015

在我的模型中,我有一堆域對象。現在我在嘗試更新使用者對象時遇到問題。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.RolenullEF,則將 only 視為user.FkRoleId描述使用者和角色之間關係的屬性,並刪除導致異常的歧義。

引用自:https://stackoverflow.com/questions/14376376