gpt4 book ai didi

c# - 由于一个或多个外键属性不可为空,因此无法更改关系。 (2)

转载 作者:行者123 更新时间:2023-12-03 23:23:16 24 4
gpt4 key购买 nike

我在 .NET 4.5 应用程序中使用 Entity Framework 6.1.3,在 Oracle 数据库服务器上使用 Code First 和手工制作的表架构。大多数事情都运行良好。对于新函数,在 SaveChanges 中抛出以下异常:

The operation failed: The relationship could not be changed because one or more of the foreign-key properties is non-nullable. When a change is made to a relationship, the related foreign-key property is set to a null value. If the foreign-key does not support null values, a new relationship must be defined, the foreign-key property must be assigned another non-null value, or the unrelated object must be deleted.



堆栈跟踪:
  • System.Data.Entity.Core.Objects.ObjectContext.PrepareToSaveChanges(System.Data.Entity.Core.Objects.SaveOptions)
  • System.Data.Entity.Core.Objects.ObjectContext.SaveChangesInternal(System.Data.Entity.Core.Objects.SaveOptions, bool)
  • System.Data.Entity.Internal.InternalContext.SaveChanges()
  • (我的代码)

  • 它没有说明问题。这对我找不到它没有帮助。 SQL 日志是空的,所以我猜这个问题是在尝试访问数据库之前由 EF 在本地检测到的。

    我的问题是: 我该如何调试这个东西? 关于哪个对象中的哪个外键具有哪个值但不应该具有的详细信息在哪里?是否有可用于 Entity Framework 的跟踪日志,其中包含有关已完成操作的内部数据?

    情况太复杂了,无法在这里展示,所以请不要要求它。我想帮助自己解决这个问题,我只是需要帮助。

    最佳答案

    您可以覆盖 DBContext 的 SaveChanges 方法,并查看所有属性的更新/删除/修改,它将最小化您需要检查错误的列表。我只需要删除/分离的,但您可以修改 .where 满足您的需求。

    public override int SaveChanges()
    {
    try
    {
    var debug = false;

    if (debug)
    {
    var modifiedEntities = ChangeTracker.Entries()
    .Where(p => p.State == EntityState.Deleted || p.State == EntityState.Detached).ToList();

    foreach (var change in modifiedEntities)
    {
    var entityName = change.Entity.GetType().Name;
    System.Diagnostics.Debug.WriteLine(string.Format("Entity {0}", entityName));

    }
    }


    return base.SaveChanges();
    }
    catch (DbEntityValidationException e)
    {
    foreach (var eve in e.EntityValidationErrors)
    {
    Debug.WriteLine("Error while Save Changes:");
    Debug.WriteLine("Entity {0} has the following validation errors:", eve.Entry.Entity.GetType().Name);
    foreach (var ve in eve.ValidationErrors)
    {
    Debug.WriteLine("Property:{0}, Error: {1}",
    ve.PropertyName, ve.ErrorMessage);
    }
    }
    throw;
    }
    catch (Exception)
    {
    throw;
    }
    }

    关于c# - 由于一个或多个外键属性不可为空,因此无法更改关系。 (2),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35798405/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com