【问题标题】:Cascade Delete Rule in EF 4.1 Code First when using Shared Primary Key Association使用共享主键关联时,EF 4.1 Code First 中的级联删除规则
【发布时间】: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 代码来实现它。无论如何感谢您的帮助。

标签: ef-code-first sql-server-ce entity-framework-4.1 cascade cascading-deletes


【解决方案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:你对这个评论有什么想法吗? stackoverflow.com/questions/5825799/…只要复制粘贴网址,以防它不去评论...
【解决方案2】:

另外,您可以使用[Required] 属性,它会在相关关系中自动将删除规则设置为“CASCADE”模式。 (并且还在数据库中将该实体的“Allow Null”属性设置为“false”)

【讨论】:

    猜你喜欢
    • 2014-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多