[英]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;
}
現在,我只有一個從Foo
到Bar
的導航屬性。 那是因為在我的真實場景中,任何人從Bar
到Foo
都沒有意義。 從Foo
到Bar
的關系實際上是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
。
這樣的映射可能嗎? 我應該提一下,在我的上下文中,我刪除了OneToManyCascadeDeleteConvention
和ManyToManyCascadeDeleteConvention
因為99%的時間我不會使用級聯刪除。 這是一個具體情況。
通過跟蹤Entity Framework生成的SQL,我還注意到如果我檢索一個Foo
實例並將其中的所有Bars設置為EntityState.Deleted,EF將刪除Foo_Bar
和Bar
兩個記錄。 我要提到的最后一件事是,我正處於一個斷開連接的場景中。
我試圖搜索它,但似乎我沒有使用正確的關鍵字,因為在這種情況下我找不到任何人。 在這一點上,我看到的唯一解決方案是Map
一個FooBar
類,但我希望有一種方法可以做到這一點。
- 編輯
看來我的刪除方法起初是錯誤的。 當我嘗試刪除時,我沒有傳遞Foo
的實例,其中Bar
列表已填滿。 在更改之后,Entity Framwork為列表中的每個Bar
創建一個delete語句。 我仍然遇到更新問題,例如同時添加和刪除項目。 會做更多的測試並發布在這里。
提前致謝。
但是當我刪除Foo時,我想刪除連接表上的記錄,但不刪除子表上的記錄。 這意味着我想要刪除Foo_Bar上的記錄,但不要將此級聯擴展到Bar。
這樣的映射可能嗎?
這實際上是唯一可行的映射。 您不能將級聯刪除擴展到Bar
表,因為在關系中(從數據庫模式角度來看) Foo_Bar
連接表是關系中的依賴項 ,而Bar
是主體 。 通常,cacscading delete僅在刪除主體時有效,但在刪除依賴時則不起作用。
因此,您不必擔心在刪除Foo
時可能會刪除Bar
,並且您不必為此應用任何特殊設置。
但是,當您刪除ManyToManyCascadeDeleteConvention
時,您會遇到問題。 它針對整個模型進行全局操作,並且沒有選項可以針對特定的多對多關系再次啟用級聯刪除。 (對於多對多關系,沒有WillCascadeOnDelete(true)
,就像有一對多關系或一對一關系一樣。)
您確定在模型中真的需要刪除ManyToManyCascadeDeleteConvention
嗎? 我從未遇到一個模型,當刪除其中一個連接的實體( Foo
或Bar
)時, 不刪除連接表中的相關條目是有意義的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.