如何解决实体框架-实体类型之间的关联受到严重限制
嗨,当我尝试删除“绑定”表中的一行时,我遇到了实体框架问题。
表格如下:
[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);
}
有人知道如何解决此问题吗?我一直在搜寻,但从未找到适合我的情况的解决方案。
解决方法
作为级联删除行为的副作用,这是一种令人惊讶且违反直觉的行为(即使删除相关实体与级联删除没有任何共同点,根据定义,级联删除应该控制删除主体时发生的情况)。甚至在EF Core文档的Removing relationships部分中都有记录:
您可以通过将引用导航设置为null来删除关系,或者从集合导航中删除相关实体。
根据关系中配置的级联删除行为,删除关系可能会对从属实体产生副作用。
等
通常,从主体的集合导航属性中删除依赖实体应被视为取消关联(可选关系)或删除(必需关系),但显然,当前的EF Core实现还通过级联删除关闭(以及某些删除)来消除必需关系的异常。其他情况)。
要解决此问题而无需激活级联删除(您的OnModelCreating
已关闭)的唯一方法是直接从相应的DbSet
或DbContext
中删除(删除)相关实体而不是来自集合导航属性。例如替换
user.UserGroups.Remove(userGroupBinding);
与任一
_dataContext.UserGroups.Remove(userGroupBinding);
或
_dataContext.Set<UserGroup>().Remove(userGroupBinding);
或者只是
_dataContext.Remove(userGroupBinding);
在两种情况下,调用SaveChanges
后,依赖实体将在数据库中删除,并通过EF Core导航属性修复从集合导航属性中删除。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。