C# 使用Fluent API配置asp mvc 4进行实体框架级联删除
我有两个类叫做User和Event 用户可以组织活动,也可以有朋友(用户) 用户类与朋友有多对多关系,如下所示: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
[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)你能写一个完整的例子吗?因为它是模糊的…!记住每个事件都需要一个组织者…!一旦需要用户,为什么要删除它?