使用共享主键关联时,EF 4.1 Code First 中的级联删除规则
Posted
技术标签:
【中文标题】使用共享主键关联时,EF 4.1 Code First 中的级联删除规则【英文标题】:Cascade Delete Rule in EF 4.1 Code First when using Shared Primary Key Association 【发布时间】:2011-04-28 22:32:36 【问题描述】:我根据这个答案实现了双向 1:1 关系:
Primary /Foreign Key in Entity Framework
我这样定义双向关系:
public class Student
public virtual int StudentId get; set;
public virtual Anamnesis Anamnesis get; set;
. . .
public class Anamnesis
[Key, ForeignKey("Student")]
public int AnamnesisId get; set;
public virtual Student Student get; set;
. . .
其中,Student 是主要实体,而 Anamnesis 是共享 PK 的实体。
现在我希望创建的关系具有删除规则 = CASCADE。实际上,正在创建的关系具有 Delete Rule = NO ACTION,如下图所示:
如果我在“表属性”窗口中手动删除此关系并使用 Delete Rule = CASCADE 添加其他关系,代码将按预期工作,允许我删除一个学生,并且它是具有相同 ID 的共享病历。
那么,我的问题来了:
有没有办法在我的班级中使用数据注释(不是 Fluent API),以便我获得与 CASCADE 删除规则的关系?我更喜欢使用 Data Annotation,但如果不可能,我会很高兴有一些 Fluent API 代码可以使这项工作。
注意
我已经尝试了post 中显示的 Fluent API 代码。在我有双向属性的情况下,它不起作用。
【问题讨论】:
Uhmmm... 现在我发布了这个问题,我发现我忘记了AnamnesisId
属性的 virtual
关键字,以符合上面链接的 Ladislav 的答案。也许这就是问题所在。我必须重新测试一遍。 :D
你能显示完整的代码吗? EF 代码优先在每次可能时默认使用级联删除,并且我在链接问题中的两个示例也使用它。
@Ladislav:再次测试并检查在数据库中创建的关系。它保持不变。没有级联。因此, virtual 关键字不是问题。定义关系的代码就是我上面展示的代码。你还需要什么吗?
你能用完整的 SQL 服务器测试这个吗?
@Ladislav:我会测试它,但@Morteza 展示了如何使用 Fluent API 代码来实现它。无论如何感谢您的帮助。
【参考方案1】:
以下 fluent API 代码完美开启对数据库的级联删除:
public class Student
public virtual int StudentId get; set;
public virtual Anamnesis Anamnesis get; set;
public class Anamnesis
public int AnamnesisId get; set;
public virtual Student Student get; set;
public class Context : DbContext
public DbSet<Student> Students get; set;
public DbSet<Anamnesis> Anamnesises get; set;
protected override void OnModelCreating(DbModelBuilder modelBuilder)
modelBuilder.Entity<Student>()
.HasRequired(s => s.Anamnesis)
.WithRequiredPrincipal(a => a.Student)
.WillCascadeOnDelete();
【讨论】:
谢谢!这成功了。顺便说一句:你有一个很棒的博客。跟上您在这里和那里所做的出色工作。上帝保佑你的生活。 @Leniel:感谢您的客气话,很高兴听到您发现这些博文很有用 :) 这个解决方案对我有用,我只是希望有一个等效的数据注释也能工作。 @MortezaManavi:你对这个评论有什么想法吗? ***.com/questions/5825799/…只要复制粘贴网址,以防它不去评论...【参考方案2】:另外,您可以使用[Required] 属性,它会在相关关系中自动将删除规则设置为“CASCADE”模式。 (并且还在数据库中将该实体的“Allow Null”属性设置为“false”)
【讨论】:
以上是关于使用共享主键关联时,EF 4.1 Code First 中的级联删除规则的主要内容,如果未能解决你的问题,请参考以下文章
在使用 EF 4.1 Code-First 的 Include 和/或 Select 方法时订购导航属性?
当使用带有 EF 4.1 Code First 的 ASP.NET MVC 3 时,我只能编辑主表,我做错了啥?
Entity Framework 4.1 Code First - 插入非主键时自动递增字段