Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架-实体类型之间的关联已被切断_C#_Asp.net Mvc_Asp.net Core_Entity Framework Core - Fatal编程技术网

C# 实体框架-实体类型之间的关联已被切断

C# 实体框架-实体类型之间的关联已被切断,c#,asp.net-mvc,asp.net-core,entity-framework-core,C#,Asp.net Mvc,Asp.net Core,Entity Framework Core,嗨,我在尝试删除“绑定”表中的一行时遇到了实体框架问题 这些表如下所示: [Table("Users")] public class UserEntity : BaseEntity { [Required] [MaxLength(30)] public string Username { get; set; } [Required] [MaxLength(200)] public string Password { get; s

嗨,我在尝试删除“绑定”表中的一行时遇到了实体框架问题

这些表如下所示:

[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; }
}
        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);
    }
但是,当我从数据库中获取一个UserEntity时,例如,获取第一个用户组并尝试删除它,如下图所示,我会得到一个错误

            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方法如下所示:

[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; }
}
        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核心文档的一节中有记录:

可以通过将引用导航设置为null或从集合导航中删除相关实体来删除关系

根据关系中配置的级联删除行为,删除关系可能会对依赖实体产生副作用

等等

一般来说,从主体的集合导航属性中删除依赖实体应被视为解除关联(可选关系)或删除(必需关系),但显然当前的EF核心实现也会抛出cascade delete off(和其他一些场景)必需关系的异常

在不激活cascade delete(您的
OnModelCreating
正在关闭)的情况下修复此问题的唯一方法是直接从相应的
DbSet
DbContext
中删除(删除)相关实体,而不是从集合导航属性中删除。e、 g.更换

user.UserGroups.Remove(userGroupBinding);
两者都有

_dataContext.UserGroups.Remove(userGroupBinding);


在这两种情况下,调用
SaveChanges
后,依赖实体将在数据库中被删除,并通过EF核心导航属性修复从集合导航属性中删除。

DeleteBehavior.Restrict=>我认为这不允许您删除
_dataContext.Remove(userGroupBinding);