使用共享主键关联时,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 - 插入非主键时自动递增字段

EF 4.1 中使用 Code First 的 ComplexType 集合属性

EF 4.1 Code First - 我应该使用啥模式?

EF 6.1 Code First 中与不同主键的一对一关系