使用 EF 的 TPT 流畅语法级联删除 child 记录
Cascade delete child record using EF's TPT fluent syntax
我正在尝试获取 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?
}
}
这就是我需要做的全部吗?某处是否有针对此特定案例的参考示例?
更新:
多亏了评论,我发现这是正确的,而且事情是按照惯例映射的。
不过我发现 child 记录在删除 parent 记录时不会自动级联删除。我可以通过脚本更改它,但我想使用 EF 方法。我如何配置 child 来做到这一点?
从回顾其他很久以前的问题来看,看起来像一个 bug/missing 功能。并且没有明确的解决方案...我已经找到了。
所以除非有人有更好的主意,否则我需要创建一个空迁移,并添加必要的 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
.
请问有没有更好的方法? (即不需要我摆弄迁移 and/or SQL。)
我正在尝试获取 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?
}
}
这就是我需要做的全部吗?某处是否有针对此特定案例的参考示例?
更新:
多亏了评论,我发现这是正确的,而且事情是按照惯例映射的。
不过我发现 child 记录在删除 parent 记录时不会自动级联删除。我可以通过脚本更改它,但我想使用 EF 方法。我如何配置 child 来做到这一点?
从回顾其他很久以前的问题来看,看起来像一个 bug/missing 功能。并且没有明确的解决方案...我已经找到了。
所以除非有人有更好的主意,否则我需要创建一个空迁移,并添加必要的 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
.
请问有没有更好的方法? (即不需要我摆弄迁移 and/or SQL。)