簡體   English   中英

如何使用Entity Framework Code First Fluent API僅在連接表上級聯刪除

[英]How to cascade delete only on join table using Entity Framework Code First Fluent API

我正在嘗試使用Entity Framework Code First Fluent API映射現有數據庫。 我在與多對多關系和級聯刪除的情況下苦苦掙扎。

這是我的兩個POCO課程:

public class Foo
{
  public int FooId;
  public string FooDescription;
  public IList<Bar> Bars;
}
public class Bar
{
  public int BarId;
  public string BarDescription;
}

現在,我只有一個從FooBar的導航屬性。 那是因為在我的真實場景中,任何人從BarFoo都沒有意義。 FooBar的關系實際上是0,n這意味着Foo一個實例不需要Bar實例。

我現有的數據庫在這兩個表之間有一個連接表。 此表如下所示:

create table Foo_Bar(
FooId int not null,
BarId int not null
);

因為我不想在我的項目中創建這樣的POCO類,所以我映射了這樣的表:

modelBuilder.Entity<Foo>()
  .HasMany(t => t.Bars)
  .WithMany()
  .Map(m =>
  {
    m.ToTable("Foo_Bar");
    m.MapLeftKey("FooId");
    m.MapRightKey("BarId");
  });

這適用於插入。 實體在Foo上插入,然后在現有的Foo_Bar表上插入。

但是當我刪除Foo ,我想刪除連接表上的記錄,但不刪除子表上的記錄。 這意味着我想要刪除Foo_Bar記錄,但不要將此級聯擴展到Bar

這樣的映射可能嗎? 我應該提一下,在我的上下文中,我刪除了OneToManyCascadeDeleteConventionManyToManyCascadeDeleteConvention因為99%的時間我不會使用級聯刪除。 這是一個具體情況。

通過跟蹤Entity Framework生成的SQL,我還注意到如果我檢索一個Foo實例並將其中的所有Bars設置為EntityState.Deleted,EF將刪除Foo_BarBar兩個記錄。 我要提到的最后一件事是,我正處於一個斷開連接的場景中。

我試圖搜索它,但似乎我沒有使用正確的關鍵字,因為在這種情況下我找不到任何人。 在這一點上,我看到的唯一解決方案是Map一個FooBar類,但我希望有一種方法可以做到這一點。

- 編輯

看來我的刪除方法起初是錯誤的。 當我嘗試刪除時,我沒有傳遞Foo的實例,其中Bar列表已填滿。 在更改之后,Entity Framwork為列表中的每個Bar創建一個delete語句。 我仍然遇到更新問題,例如同時添加和刪除項目。 會做更多的測試並發布在這里。

提前致謝。

但是當我刪除Foo時,我想刪除連接表上的記錄,但不刪除子表上的記錄。 這意味着我想要刪除Foo_Bar上的記錄,但不要將此級聯擴展到Bar。

這樣的映射可能嗎?

這實際上是唯一可行的映射。 您不能將級聯刪除擴展到Bar表,因為在關系中(從數據庫模式角度來看) Foo_Bar連接表是關系中的依賴項 ,而Bar主體 通常,cacscading delete僅在刪除主體時有效,但在刪除依賴時則不起作用。

因此,您不必擔心在刪除Foo時可能會刪除Bar ,並且您不必為此應用任何特殊設置。

但是,當您刪除ManyToManyCascadeDeleteConvention時,您會遇到問題。 它針對整個模型進行全局操作,並且沒有選項可以針對特定的多對多關系再次啟用級聯刪除。 (對於多對多關系,沒有WillCascadeOnDelete(true) ,就像有一對多關系或一對一關系一樣。)

您確定在模型中真的需要刪除ManyToManyCascadeDeleteConvention嗎? 我從未遇到一個模型,當刪除其中一個連接的實體( FooBar )時, 刪除連接表中的相關條目是有意義的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM