【问题标题】:how to configure cascade delete with EF Fluent API如何使用 EF Fluent API 配置级联删除
【发布时间】:2016-08-02 23:21:19
【问题描述】:

我有以下类和 EF 约定可以很好地创建表格 - 一切都很好。现在我想在 ToDoList 上配置级联删除(这样当我删除 ToDoList 时,所有 ToDoItems 和 UserToDoLists 也会自动删除)。为了设置 WillCascadeOnDelete,我必须重新指定能够检测到的 EF 约定吗?如何在 fluent API 中指定这种关系?

public class ToDoList
{
    public int Id { get; set; }
    public string Description { get; set; }
    public virtual ICollection<ToDoItem> ToDoItems { get; set; }
    public virtual ICollection<UserToDoList> UserToDoLists { get; set; }
}

public class ApplicationUser : IdentityUser
{
    public ApplicationUser()
        : base()
    {
    }

    public virtual ICollection<UserToDoList> UserToDoLists { get; set; }
}

// a todolist can have many users and a user can have many todolist
// junction table will have addition fields
public class UserToDoList
{
    public string UserId { get; set; }
    public virtual ApplicationUser User { get; set; }

    public virtual int ToDoListId { get; set; }
    public virtual ToDoList ToDoList { get; set; }

    // additional fields
    public bool IsOwner { get; set; }
    public int Ordinal { get; set; }
    public bool AllowEdit { get; set; }
}

public class UserToDoListConfig : EntityTypeConfiguration<UserToDoList>
{
    public UserToDoListConfig()
    {
        HasKey(ut => new { ut.UserId, ut.ToDoListId });
    }
}

public class ToDoListConfig : EntityTypeConfiguration<ToDoList>
{
    public ToDoListConfig()
    {
        Property(t => t.Description).IsRequired().HasMaxLength(50);

        HasMany(t =>t.UserToDoLists).??
    }
}

【问题讨论】:

  • 级联删除应该是像您这样的one-to-many 关系的默认行为。你检查生成的表/外键了吗?
  • 我的是多对多关系
  • @lee23 你正在考虑Application - ToDoList 这确实是many-to-many。但是您使用显式的UserToDoList 联结表和2 个one-to-many 关系User - UserToDoList 和ToDoList - UserToDoList 实现了它。同样,这些关系默认情况下具有级联删除功能。

标签: entity-framework ef-fluent-api


【解决方案1】:

这是从ToDoList 到您的联结表UserToDoList 的简单一对多关系,因此您只需像这样设置映射

HasMany(m => m.UserToDoLists)
    .WithRequired(m => m.ToDoList)
    .HasForeignKey(m => m.ToDoListId);

EF 将自动处理您的级联删除,因为在联结表一侧需要ToDoList。

【讨论】:

  • 谢谢,问题也是我从 ApplicationUser.UserToDoLists 而不是 DbContext.ToDoLists 中删除的错误。
猜你喜欢
  • 2014-09-26
  • 2019-11-28
  • 2016-03-06
  • 1970-01-01
  • 1970-01-01
  • 2011-05-08
  • 2015-03-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多