2015-09-07 80 views
0

我試圖獲得TPT工作的基本示例。大多數參考文獻都會討論TPT,以及它如何工作,但不涉及實際的流暢映射細節。這是我到目前爲止:使用EF的TPT流利語法級聯刪除子記錄

public abstract class Parent { 
    public Parent() { } 
    public int Id { get; set; } 
    // other properties... 
} 

public class Child : Parent { 
    public Child() : base() { } 
    // other properties... 
} 

public class MyContext : DbContext { 
    protected override void OnModelCreating(DbModelBuilder modelBuilder) { 

    var p = modelBuilder.Entity<Parent>(); 
    p.ToTable("Parent"); 
    p.HasKey(m => m.Id); 
    p.Property(m => m.Id).HasColumnName("Id").IsRequired().HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 

    var c = modelBuilder.Entity<Child>(); 
    c.ToTable("Child"); 
    //c.HasKey(m => m.Id);          // needed? 
    //c.Property(m => m.Id).HasColumnName("Id").IsRequired(); // needed? 

    } 
} 

這是我需要做的嗎?有沒有這個具體案例的參考例子?

UPDATE:
感謝的評論,我發現,這是正確的,並且事情正在按照慣例映射。

但是我發現,雖然子記錄不會在父記錄被刪除時自動級聯刪除。我可以通過腳本改變它,但我想使用EF方法。我如何配置孩子這樣做?

+1

這些鍵應該按照慣例映射,包括'IDENTITY' - 如果您已經顯示,它提供了'Id'。你在插入時出現什麼錯誤(你能看到一些代碼?) –

+0

'ToTable'應該足夠了。詳細說明*我遇到問題*。 –

+0

@Ic查看上面編輯 –

回答

0

從回顧其他問題的方式回來,看起來像一個錯誤/缺少的功能。並沒有明確的解決方案......我找到了。

所以除非有人有更好的主意,我需要創建一個空的遷移,並添加必要的SQL語句來強制級聯刪除:

AddForeignKey("dbo.Child", "Id", "dbo.Parent", "Id", true); // <- true is the trick 

...產生:

ALTER TABLE [Child] ADD CONSTRAINT [FK_dbo.Child_dbo.Parent_Id] 
FOREIGN KEY ([Id]) REFERENCES [Parent]([Id]) ON DELETE CASCADE ON UPDATE NO ACTION; 

請注意ON DELETE CASCADE

請告訴我,如果有更好的方法? (即,不需要我操縱遷移和/或SQL的操作)。