使用EF的TPT流利语法级联删除子记录

时间:2015-09-07 14:39:16

标签: c# entity-framework table-per-type

我正在尝试获得TPT工作的基本示例。大多数参考文献一般性地讨论了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?

  }
}

这就是我需要做的一切吗?某个地方是否有针对此特定案例的参考示例?

更新
感谢这些评论,我发现这是正确的,事情是按惯例映射的。

我发现的是,删除父记录时,子记录不会自动级联删除。我可以通过脚本更改此内容,但我想使用EF方法。如何配置孩子这样做?

1 个答案:

答案 0 :(得分: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的那个。)