1
您好我正在使用實體框架來設置我的數據庫。我有一對多的關係實體,我想只刪除父級實體沒有級聯刪除。我從父母那裏刪除錯誤,但我真的想讓我的孩子成爲記錄的理由。有沒有辦法只刪除父母而沒有錯誤?刪除父實體而不刪除相關子
您好我正在使用實體框架來設置我的數據庫。我有一對多的關係實體,我想只刪除父級實體沒有級聯刪除。我從父母那裏刪除錯誤,但我真的想讓我的孩子成爲記錄的理由。有沒有辦法只刪除父母而沒有錯誤?刪除父實體而不刪除相關子
這是一個老問題,但今天我遇到了這個問題,所以我會分享我找到的解決方案。
長篇故事短版本是你需要加載你的孩子聯想。假設你有正確的關係,建立和Foo
有很多Bars
,這個代碼應該做的正是你想要的東西:
public void Delete(Guid fooId)
{
using (var context = new MyDbContext())
{
var foo = context.Foos.Include("Bars").FirstOrDefault(foo => foo.Id == fooId);
if (foo != null)
{
context.Foos.Remove(foo);
context.SaveChanges();
}
}
}
這裏的關鍵是調用.Include
。如果沒有這個,更新將會失敗並導致外鍵違例。
現在,當我說我假設你有你的關係設置正確,我的意思是他們應該看起來像這樣。
// Foo.cs
public class Foo
{
public Guid Id { get; set; }
public ICollection<Bar> Bars { get; set; }
}
// Bar.cs
public class Bar
{
public Guid Id { get; set; }
public Guid? FooId { get; set; }
public virtual Foo Foo { get; set; }
}
// MyDbContext
modelBuilder.Entity<Foo>()
.HasMany(e => e.Bars)
.WithRequired(e => e.Foo)
.HasForeignKey(e => e.FooId)
.WillCascadeOnDelete(false);
見http://stackoverflow.com/questions/5048561/entity-framework-set-delete-rule-with-codefirst或http://stackoverflow.com/questions/9136255/ef4-1-code可能是第一次禁用刪除cascade for a-relationship-without-navi。嘗試搜索「on delete set null」(在EF中本不存在,但應該導致類似的解決方案) – user2864740
感謝您的回覆,所以我已經使用「on delete set null」爲子實體,但是何時我刪除了父實體,整個子實體都被刪除了,不僅是孩子的外鍵。仍然卡住.. – tamikoon