Mar*_*n C 6 c# asp.net-mvc entity-framework-core asp.net-core
您好,当我尝试删除“绑定”表中的一行时,我遇到了实体框架问题。
这些表看起来像这样:
[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; }
}
Run Code Online (Sandbox Code Playgroud)
现在我有了将这两者绑定在一起的表:
[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; }
}
Run Code Online (Sandbox Code Playgroud)
但是,当我从数据库中获取 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();
Run Code Online (Sandbox Code Playgroud)
我收到的错误消息:
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.'
Run Code Online (Sandbox Code Playgroud)
我的 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);
}
Run Code Online (Sandbox Code Playgroud)
有谁知道如何解决这个问题?我一直在寻找,但从未找到适合我的情况的解决方案。
Iva*_*oev 12
这是一种令人惊讶且违反直觉的行为,是级联删除行为的副作用(尽管删除相关实体与级联删除没有任何共同之处,根据定义,级联删除应该控制删除主体实体时发生的情况)。它甚至记录在EF Core 文档的删除关系部分中:
您可以通过将引用导航设置为 null 或从集合导航中删除相关实体来删除关系。
根据关系中配置的级联删除行为,删除关系可能会对依赖实体产生副作用。
ETC。
一般来说,从主体的集合导航属性中删除依赖实体应被视为解除关联(可选关系)或删除(必需关系),但显然当前 EF Core 实现也会因级联删除关闭(以及其他一些场景)而引发所需关系的异常。
OnModelCreating在不激活级联删除(您正在关闭)的情况下解决此问题的唯一方法是直接从相应的DbSet或DbContext而不是从集合导航属性中删除(删除)相关实体。例如替换
user.UserGroups.Remove(userGroupBinding);
Run Code Online (Sandbox Code Playgroud)
与任一
_dataContext.UserGroups.Remove(userGroupBinding);
Run Code Online (Sandbox Code Playgroud)
或者
_dataContext.Set<UserGroup>().Remove(userGroupBinding);
Run Code Online (Sandbox Code Playgroud)
要不就
_dataContext.Remove(userGroupBinding);
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,调用后,SaveChanges依赖实体将在数据库中删除,并通过 EF Core 导航属性修复从集合导航属性中删除。
| 归档时间: |
|
| 查看次数: |
9371 次 |
| 最近记录: |