2014-03-31 62 views
0

我已經閱讀了很多關於使用EF在stackoverflow上的外鍵問題及其建議解決方案的問題。但沒有人爲我的案件工作。帶實體框架代碼的外鍵第一種方法

我有一個父類XSection

public class XSection 
{ 
    public int ObjectId {get; set;} 
    public OverBank LeftOverBank {get; set;} 
    public OverBank RightOverBank {get; set;} 
} 

的overbanks是子實體父Xsection類(僅一個不在名單)。該OverBanks類看起來喜歡

public class OverBank 
{ 
    public int ObjectId {get; set;} 
    public int ParentId (get; set;} 

    public double Station {get; set;} 
    // some other basic properties 
} 

的DDL上述類生成的是:

截面表

CREATE TABLE CrossSection ( 
    ObjectID INTEGER NOT NULL, 
    LeftOverbank_ObjectID INTEGER NULL, 
    RightOverbank_ObjectID INTEGER NULL, 
    PRIMARY KEY (ObjectID), 
    FOREIGN KEY (LeftOverbank_ObjectID) REFERENCES Overbank (ObjectID) ON DELETE CASCADE, 
    FOREIGN KEY (RightOverbank_ObjectID) REFERENCES Overbank (ObjectID) ON DELETE CASCADE, 
); 

CREATE INDEX IX_FK_CrossSection_LeftOverbank ON CrossSection (LeftOverbank_ObjectID); 

CREATE INDEX IX_FK_CrossSection_RightOverbank ON CrossSection (RightOverbank_ObjectID); 

漫灘表

CREATE TABLE Overbank ( 
    ObjectID INTEGER NOT NULL, 
    Station real NULL, 
    DisplayLabel text NULL, 
    Description text NULL, 
    Name text NULL, 
    PRIMARY KEY (ObjectID), 

); 

要啓用級聯刪除,我在OnModelCreating事件中編寫了以下內容:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 

    modelBuilder.Entity <CrossSection>() 
       .ToTable("CrossSection"); 
    modelBuilder.Entity <Overbank>() 
       .ToTable("Overbank"); 

    modelBuilder.Entity<CrossSection>().HasOptional(xs => xs.LeftOverbank).WithMany().WillCascadeOnDelete(true); 
    modelBuilder.Entity<CrossSection>().HasOptional(xs => xs.RightOverbank).WithMany().WillCascadeOnDelete(true); 

    base.OnModelCreating(modelBuilder); 
} 

我們可以看到外鍵約束被顛倒過來。另外當我刪除橫斷面相關的銀行不刪除,而當我刪除銀行相關的橫斷面被刪除。而我們需要與我們現在所擁有的完全相反。有什麼非常愚蠢的。

+0

是你寫的所有映射配置嗎?還是有更多? –

+0

我編輯了完整的OnModelCreating事件。 – Mohit

回答

1

這些Overbank屬性中的每一個實際上都是0..1:1的關係。這是「零或一對一」。而不是WithMany(),請嘗試WithRequiredPrincipal()

+0

哦,我知道了,我改變了相同的modelBuilder.Entity ()。HasOptional (xs => xs.LeftOverbank).WithOptionalPrincipal()。WillCascadeOnDelete(true);.現在關係正在正確構建,但級聯刪除未設置爲true。 – Mohit

+0

可能是因爲此模型不能真正符合實體框架約定。 EF要求1:1和0..1:1關係中的表具有相同的主鍵,主表生成標識並且從屬表不具有標識列。但是這個約定會使雙重0..1:1的關係變得不可能。讓我退後一步,問一個更廣泛的問題。如果Overbank只是一個double(它可能應該是一個小數,除非你知道它需要是一個浮點數)並且該關係是0..1:1級聯刪除,那麼爲什麼它們在一個單獨的表中呢? –

+0

我還沒有提到其他一些屬性來保持示例簡單。另外,當我手動更新使用dbEditor的CASCADE刪除選項時,一切正常。 – Mohit

相關問題