C# 使用Fluent API配置asp mvc 4进行实体框架级联删除

C# 使用Fluent API配置asp mvc 4进行实体框架级联删除,c#,entity-framework,asp.net-mvc-4,C#,Entity Framework,Asp.net Mvc 4,我有两个类叫做User和Event 用户可以组织活动,也可以有朋友(用户) 用户类与朋友有多对多关系,如下所示: [Table("User")] public class User { public User() { EventOrganized = new List<Event>(); } public virtual ICollection<User> Friends { get; set; } public virtual IColle

我有两个类叫做User和Event

用户可以组织活动,也可以有朋友(用户)

用户类与朋友有多对多关系,如下所示:

[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; }
}
[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; }
公共数据库集用户{get;set;}
公共数据库集事件{get;set;}
我的modelBuilder配置如下所示:

 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);
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
基于模型创建(modelBuilder);
modelBuilder.Entity().HasMany(u=>u.Friends).WithMany().Map(
u=>
{
u、 MapLeftKey(“用户ID”);
u、 MapRightKey(“FriendId”);
u、 易变(“友谊”);
});
modelBuilder.Entity().HasRequired(e=>e.Organizer).WithMany().WillCascadeOnDelete(false);
我希望能够使用cascade delete删除一个用户(他组织的活动,他的朋友关系)

示例: 如果我删除一个用户,我希望删除该用户组织的所有事件,并在用户和朋友之间的中间表“frienship”中,在其id出现的每一行删除其用户id

捕获异常的My delete方法:

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) {}
试试看{
List-friendsIds=userToRemove.Friends.Select(f=>f.UserId.ToList();
foreach(FriendSID中的int-friendID)
{
User-friend=db.Users.Find(friendID);
friend.Friends.Remove(userToRemove);
}
db.Users.Remove(userToRemove);
保存更改();
捕获(异常){}
当用户组织活动时,例外情况为: DELETE语句与引用约束“FK_dbo.Event_dbo.User_OrganizerId”冲突。 冲突发生在数据库“database\”表“dbo.Event\”列“OrganizerId”中

**当我们要删除的用户具有frienships时:** DELETE语句与引用约束“FK_dbo.friendy_dbo.User_FriendId”冲突。冲突发生在数据库“database\”表“dbo.friendy\”列“FriendId”中


如何修改Api fluent配置?

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

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

在Users表中添加新列(在类“isDeleted”中的新属性,其类型为“bit”(在布尔类型中)。“0”表示false,“1”表示true


我希望能有所帮助。

我看到的另一个解决方案是从这里删除“hasRequired”:modelBuilder.Entity().hasRequired(e=>e.Organizer)你能写一个完整的例子吗?因为它是模糊的…!记住每个事件都需要一个组织者…!一旦需要用户,为什么要删除它?