【问题标题】:Entity Framework Cascade Delete using Fluent API Configuration asp mvc 4实体框架级联删除使用流利的 API 配置 asp mvc 4
【发布时间】:2015-05-25 10:51:03
【问题描述】:

我有两个类叫做 User 和 Event。

用户可以组织活动,并且可以有朋友(用户)。

User 类与 Friends 是多对多的关系,如下所示:

[Table("User")]
public class User 
{   
  public User() {
   EventOrganized = new List<Event>();
  }
  public virtual ICollection<User> Friends { get; set; }
  public virtual ICollection<Event> EventOrganized { get; set; }
}

Event 类与 User 是一对多的关系,如下所示:

[Table("Event")]
public class Event
{
  public int OrganizerId { get; set; }
  [ForeignKey("OrganizerId")]

  public virtual User Organizer { get; set; }
}

我的上下文有:

public DbSet<User> Users { get; set; }
public DbSet<Event> Events{ get; set; }

我的模型构建器配置如下:

 protected override void OnModelCreating(DbModelBuilder modelBuilder)
 {
  base.OnModelCreating(modelBuilder);
  modelBuilder.Entity<User>().HasMany(u => u.Friends).WithMany().Map(
            u =>
            {
                u.MapLeftKey("UserId");
                u.MapRightKey("FriendId");
                u.ToTable("Friendship");
            });
  modelBuilder.Entity<Event>().HasRequired(e => e.Organizer).WithMany().WillCascadeOnDelete(false);

我希望能够通过级联删除删除用户(他组织的活动,他的友谊)。

示例: 如果我删除一个用户,我想删除这个用户组织的所有事件,并在他的 ID 出现的每一行删除用户和朋友之间的中间表“友谊”中的用户 ID。

我的捕获异常的删除方法:

Try {
List<int> friendsIds = userToRemove.Friends.Select(f => f.UserId).ToList();
    foreach (int friendID in friendsIds)
    {
      User friend = db.Users.Find(friendID);
      friend.Friends.Remove(userToRemove);
    }
 db.Users.Remove(userToRemove);
 SaveChanges();
Catch(Exception) {}

当用户组织了一个活动时,例外是: “DELETE 语句与 REFERENCE 约束 \"FK_dbo.Event_dbo.User_OrganizerId\" 冲突。 数据库“Database”、表“dbo.Event”、“OrganizerId”列中发生冲突。

**当我们要删除的用户有友谊时:** "DELETE 语句与 REFERENCE 约束 \"FK_dbo.Friendship_dbo.User_FriendId\" 冲突。冲突发生在数据库 \"Database\"、表 \"dbo.Friendship\"、列 'FriendId' 中。

我应该如何修改我的 Api fluent 配置?

【问题讨论】:

    标签: c# entity-framework asp.net-mvc-4


    【解决方案1】:

    不能删除其他表中外键引用PK的用户。

    在这种情况下,您可以使用其他逻辑来删除用户,例如:

    在用户表中添加新列(在您的情况下为类中的新属性)“isDeleted”,其类型为“位”(在您的情况下为布尔类型)。 '0' 代表假,'1' 代表真。

    希望对你有所帮助。

    【讨论】:

    • 我看到的另一个解决方案是从这里删除“hasRequired”:modelBuilder.Entity().HasRequired(e => e.Organizer)
    • 你能写一个完整的例子吗?因为模糊了……!请记住,每个活动都需要一个组织者......!
    • 一旦需要用户为什么要删除它?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多