嗨,当我试图删除“绑定”表中的一行时,我遇到了实体框架的问题。
这些桌子看起来如下:
[Table("Users")]
public class UserEntity : BaseEntity
{
[Required]
[MaxLength(30)]
public string Username { get; set; }
[Required]
[MaxLength(200)]
public string Password { get; set; }
[Required]
[MaxLength(200)]
public string Name { get; set; }
[Required]
[MaxLength(20)]
public string Cellphone { get; set; }
public virtual ICollection<UserGroupEntity> UserGroups { get; set; }
[Table("Groups")]
public class GroupEntity : BaseEntity
{
[Required]
[MaxLength(20)]
public string Code { get; set; }
[Required]
[MaxLength(200)]
public string Name { get; set; }
}
现在我有一张把这两件事联系在一起的桌子:
[Table("UserGroups")]
public class UserGroupEntity : BaseEntity
{
[Required]
[ForeignKey("User")]
public int UserId { get; set; }
[Required]
[ForeignKey("Group")]
public int GroupId { get; set; }
public virtual UserEntity User { get; set; }
public virtual GroupEntity Group { get; set; }
}
但是,当我从数据库中获取一个UserEntity (例如,获取第一个UserGroup并尝试删除它,如下所示)时,我会得到一个错误
UserEntity user = _dataContext.Users
.Include(x => x.UserGroups)
.ThenInclude(x => x.Group)
.SingleOrDefault(x => x.Id == model.Id && !x.IsDeleted);
UserGroupEntity userGroupBinding = user.UserGroups.First();
user.UserGroups.Remove(userGroupBinding);
_dataContext.SaveChanges();
我得到的错误消息:
The association between entity types 'UserEntity' and 'UserGroupEntity' has been severed but the relationship is either marked as 'Required' or is implicitly required because the foreign key is not nullable. If the dependent/child entity should be deleted when a required relationship is severed, then setup the relationship to use cascade deletes. Consider using 'DbContextOptionsBuilder.EnableSensitiveDataLogging' to see the key values.'
我的DbContext OnModelCreating方法如下所示:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
var cascadeFKs = modelBuilder.Model.GetEntityTypes()
.SelectMany(t => t.GetForeignKeys())
.Where(fk => !fk.IsOwnership && fk.DeleteBehavior == DeleteBehavior.Cascade);
foreach (var fk in cascadeFKs)
fk.DeleteBehavior = DeleteBehavior.Restrict;
base.OnModelCreating(modelBuilder);
}
有没有人知道如何解决这个问题?我一直在寻找我的案子,但从未找到解决办法。
发布于 2020-09-02 09:06:59
这是一种令人惊讶和违反直觉的行为,是级联删除行为的副作用(尽管删除相关实体与级联删除没有任何共同之处,但根据定义,级联删除应该控制在删除主体实体时发生的事情)。它甚至记录在EF核心文档的移除关系部分:
可以通过将引用导航设置为null或从集合导航中删除相关实体来删除关系。 根据关系中配置的级联删除行为,删除关系可能会对依赖实体产生副作用。
等。
通常,从主体的集合导航属性中删除依赖实体应被视为不关联(可选关系)或删除(所需关系),但显然当前的EF Core实现也会抛出与级联删除关闭(和其他一些场景)之间的所需关系的异常。
在不激活级联删除(您的OnModelCreating
正在关闭的)的情况下修复该问题的唯一方法是直接从相应的DbSet
或DbContext
中删除(删除)相关实体,而不是从集合导航属性中删除(删除)。例如替换
user.UserGroups.Remove(userGroupBinding);
任一种
_dataContext.UserGroups.Remove(userGroupBinding);
或
_dataContext.Set<UserGroup>().Remove(userGroupBinding);
或者只是
_dataContext.Remove(userGroupBinding);
在这两种情况下,调用SaveChanges
之后,依赖实体将被删除在数据库中,并通过EF导航属性修复从集合导航属性中删除。
https://stackoverflow.com/questions/63706223
复制