2013-10-22 118 views
1

您好我正在使用實體框架來設置我的數據庫。我有一對多的關係實體,我想只刪除父級實體沒有級聯刪除。我從父母那裏刪除錯誤,但我真的想讓我的孩子成爲記錄的理由。有沒有辦法只刪除父母而沒有錯誤?刪除父實體而不刪除相關子

+0

見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

+0

感謝您的回覆,所以我已經使用「on delete set null」爲子實體,但是何時我刪除了父實體,整個子實體都被刪除了,不僅是孩子的外鍵。仍然卡住.. – tamikoon

回答

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);