无法删除需要父属性的ef实体

里卡德·里列伯格(Rickard Liljeberg)

我对EF并不满意,所以也许这很容易。

我有

    public void DeleteLicense(int licenseId)
    {
        var entityToDelete = context.Licenses.Find(licenseId);
        context.Licenses.Remove(entityToDelete);
    }

我检查了它是否找到了正确的许可证,并且上下文是ninject(每个请求一个)DbContext,

但是,当我运行上面的函数后,在上下文中调用SaveChanges()时,出现了一个奇怪的错误。我得到:“ CustomerName字段为必填。

现在这很奇怪,因为CustomerName位于帐户(不是许可证)中,但仍已链接。因此,这里有更多内容:

我的帐户实体

[Required]
public String CustomerName { get; set; }

public virtual ICollection<License> Licenses { get; set; }
...

我的许可证实体

public virtual Account Account { get; set; }
...

我的流利设置

modelBuilder.Entity<Account>().HasMany(x => x.Licenses)
.WithRequired(x => x.Account).WillCascadeOnDelete(false);

我不明白,因为即使约束失败,为什么还要缺少CustomerName。自删除许可证以来,我并没有触摸CustomerName,而是设置了CustomerName。

更新

因此,这是代码中的更多详细信息。据我所知,完整的执行路径是

下面的DeleteLicenseAPI进行调用,ID正确,并将其传递给私有函数。私有函数调用问题顶部附近显示DeleteLicense提交()只要求context.SaveChanges();

public ActionResult DeleteLicenseAPI(int licenseId)
{
        if (DeleteLicense(licenseId))
        {
            return Content("ok");
        }

        return Content("[[[Failed to delete license]]]");

}

private bool DeleteLicense(int licenseId)
{
        //todo: sort out busniess rules for delete, is cascaded?
        _accountRepository.DeleteLicense(licenseId);
        _accountRepository.Commit();

        return true;
}

_accountRepository这个样子的

public class EFAccountRepository : EntityFrameworkRepository<Account>
, IAccountRepository

public EFAccountRepository(EvercateContext context) : base(context)
{       
}

这是Ninject中设置所有代码的代码

kernel.Bind<EvercateContext>()
.To<EvercateContext>()
.InRequestScope()
.WithConstructorArgument("connectionStringOrName", "EvercateConnection");


kernel.Bind<IAccountRepository>().To<EFAccountRepository>();

因此,就我所知,即使我使用工作单位(也不应该),在运行SaveChanges之前,此请求中也没有其他要求。有什么方法可以查看DbContext在SaveChanges上将执行的操作,而无需实际运行该方法(因为它会抛出DbEntityValidationException

贫民窟

我可以想象如果您像这样AccountLicense构造函数中初始化navigation属性,可能会发生这种奇怪的异常

public License
{
    Account = new Account();
}

呼叫时的流程...

var entityToDelete = context.Licenses.Find(licenseId);
context.Licenses.Remove(entityToDelete);

...可能是:

  • License实体被加载(没有导航属性Account)并附加到上下文(状态Unchanged
  • 构造函数设置了Account导航属性,但未附加(状态Detached
  • 调用时RemoveLicense实体DetectChanges由EF内部调用。它检测到License.Account引用了一个分离的实体,并将其附加到上下文(处于状态Added)。的状态License更改为Deleted
  • 当您调用SaveChanges变更跟踪器时,将找到两个实体:Licensein状态DeletedAccountin state Added
  • 运行验证,发现应该插入数据库CustomerName的实体的必需属性(因为仅调用的默认构造函数)。AccountnullAccount
  • 抛出验证异常。

我不确定细节是否正确,但是类似的事情可能正在发生。

无论如何,都应Account = new Account();License构造函数中删除,并检查是否在代码库中的实体构造函数中还初始化了其他参考导航属性。(可以初始化空的导航集合。)这是众所周知的奇怪问题的常见原因,这些问题很难发现和理解。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

EF Core 2.0 当基于实体列表计算属性时,它需要两个 SaveChanges()

来自分类Dev

使用已经存在的 EF 更新父实体

来自分类Dev

无法删除实体实例

来自分类Dev

Linq到实体还是SQL Server?无法获得我需要的结果。MVC EF

来自分类Dev

无法删除父项

来自分类Dev

无法使用Hibernate删除具有@OneToMany关系的父JPA实体

来自分类Dev

需要使用另一个属性的名称将EF实体属性映射到列

来自分类Dev

使用EF Core 5.0加载自引用实体(只需在其导航属性中获取父级及其子级)

来自分类Dev

无法从EF迁移生成实体框架手动删除的表

来自分类Dev

无法从EF迁移生成实体框架手动删除的表

来自分类Dev

EF Core>删除实体(软删除)>实体状态保持不变

来自分类Dev

Core Data 中父实体的计算属性

来自分类Dev

重新附加父实体时删除子实体

来自分类Dev

EF-从上级实体删除关系

来自分类Dev

(保持孤儿存活)如何在父删除时映射子实体以将parentID属性设置为null

来自分类Dev

NHiberante无法删除子实体

来自分类Dev

NHiberante无法删除子实体

来自分类Dev

实体框架无法完成删除

来自分类Dev

无法删除或更新父行

来自分类Dev

当指定为级联删除时,实体框架无法加载外键数组属性

来自分类Dev

Swift CoreData 子实体无法通过父实体访问

来自分类Dev

非实体类需要[Key]属性

来自分类Dev

AttributeError:无法删除属性

来自分类Dev

EF Core 无法将具有两个导航属性的实体更新为同一对象(其他实体)

来自分类Dev

更新EF6时需要属性

来自分类Dev

实体框架导航集合属性删除

来自分类Dev

当实体的属性引用相同实体时,该如何删除?

来自分类Dev

实体框架:如何在更新或删除“通用”父对象时删除相关实体

来自分类Dev

在Hibernate中如何删除没有孩子的父实体?

Related 相关文章

  1. 1

    EF Core 2.0 当基于实体列表计算属性时,它需要两个 SaveChanges()

  2. 2

    使用已经存在的 EF 更新父实体

  3. 3

    无法删除实体实例

  4. 4

    Linq到实体还是SQL Server?无法获得我需要的结果。MVC EF

  5. 5

    无法删除父项

  6. 6

    无法使用Hibernate删除具有@OneToMany关系的父JPA实体

  7. 7

    需要使用另一个属性的名称将EF实体属性映射到列

  8. 8

    使用EF Core 5.0加载自引用实体(只需在其导航属性中获取父级及其子级)

  9. 9

    无法从EF迁移生成实体框架手动删除的表

  10. 10

    无法从EF迁移生成实体框架手动删除的表

  11. 11

    EF Core>删除实体(软删除)>实体状态保持不变

  12. 12

    Core Data 中父实体的计算属性

  13. 13

    重新附加父实体时删除子实体

  14. 14

    EF-从上级实体删除关系

  15. 15

    (保持孤儿存活)如何在父删除时映射子实体以将parentID属性设置为null

  16. 16

    NHiberante无法删除子实体

  17. 17

    NHiberante无法删除子实体

  18. 18

    实体框架无法完成删除

  19. 19

    无法删除或更新父行

  20. 20

    当指定为级联删除时,实体框架无法加载外键数组属性

  21. 21

    Swift CoreData 子实体无法通过父实体访问

  22. 22

    非实体类需要[Key]属性

  23. 23

    AttributeError:无法删除属性

  24. 24

    EF Core 无法将具有两个导航属性的实体更新为同一对象(其他实体)

  25. 25

    更新EF6时需要属性

  26. 26

    实体框架导航集合属性删除

  27. 27

    当实体的属性引用相同实体时,该如何删除?

  28. 28

    实体框架:如何在更新或删除“通用”父对象时删除相关实体

  29. 29

    在Hibernate中如何删除没有孩子的父实体?

热门标签

归档