1. 程式人生 > 實用技巧 >MVC 導航屬性刪除記錄報錯

MVC 導航屬性刪除記錄報錯

MVC 導航屬性試圖移除某條記錄報如下錯誤

The relationship could not be changed because one or more of the foreign-key properties is non-nullable. When a change is made to a relationship, the related foreign-key property is set to a null value. If the foreign-key does not support null values, a new relationship must be defined, the foreign-key property must be assigned another non-null value, or the unrelated object must be deleted.

具體如下:

定義了兩個model

    public class Blog
    {
        public int BlogId { get; set; }
        public string Name { get; set; }
        public string Url { get; set; }
        public virtual ICollection<Post> Posts { get; set; }
    }

    public class Post
    {
        public int PostID { get
; set; } public int BlogId { get; set; } public string Name { get; set; } public string Url { get; set; } public virtual Blog Blog { get; set; } }

然後往這兩個model對應的表中寫入記錄,之後再刪除部落格1下面的所有post,結果報了上面的錯誤

 using (var db = new BlogContext())
            {
                
//新增資料 Blog b = new Blog { Name = "Another Blog " + db.Blogs.Count() }; Post po = new Post(); po.Name = "post" + db.Blogs.Count(); po.Url = "http://www.baidu.com"; b.Posts=new List<Post>(); b.Posts.Add(po); db.Blogs.Add(b); db.SaveChanges(); //嘗試刪除blog1下面的所有文章 var blog1 = db.Blogs.Find(1); for (int k = blog1.Posts.Count() - 1; k >= 0; k--) { var p = blog1.Posts.ToList()[k]; blog1.Posts.Remove(p); } db.SaveChanges(); }

經過研究發現是我理解錯誤blog1.Posts.Remove(p);這句程式碼的作用把blog1和p兩個物件之間的關係斷開,即把p的blogid設定為null,不是不p從資料庫中刪除,而我們設定了blogid 外來鍵不能為null,這就不難理解為什麼出現上面的錯誤了

為了使上面不報錯可以把blogid設定為允許null。但是這並不是我想要的,我想要的是刪除blog1下面的所有文章,要達到這個效果要直接操作post對應的表,比如

var post = db.Posts.Find(1);
db.Posts.Remove(post);

通過這個問題我也再次理解到導航屬性是用來管理兩個表直接的關係的,並不可以通過導航屬性直接刪除導航屬性表的資料,雖然可以通過導航屬性新增資料