【问题标题】:Entities in 'Y' participate in the 'FK_Y_X' relationship. 0 related 'X' were found. 1 'X' is expected“Y”中的实体参与“FK_Y_X”关系。找到 0 个相关的“X”。预计有 1 个“X”
【发布时间】:2014-07-14 09:46:13
【问题描述】:

我在XY 之间有1..* 关系,其中X 是父级。当我尝试删除记录 Y 时,我收到以下异常消息:

“Y”中的实体参与“FK_Y_X”关系。找到 0 个相关的“X”。预计有 1 个“X”。

我目前正在尝试通过以下方式以通用、断开连接的方式删除记录:

public bool Delete(TEntity entity)
{
    if (entity == null)
    {
        return false;
    }
    try
    {
        var entry = _context.Entry(entity);
        entry.State = EntityState.Deleted;
        _context.SaveChanges();
        return true;
    }
    catch
    {
        return false;
    }
}

传入的实体在同一个上下文中加载了AsNoTracking()

有什么想法吗?

【问题讨论】:

  • EntityState.Deleted does not work, Remove(entity) does? 的可能副本 - 不是一个确切的副本,但也许它可以很好地解释您的问题
  • @BartoszKP 实体Y 是一个孩子,没有其他孩子。调用 Set<TEntity>().Remove(entity) 后会产生相同的结果。确认一下,我只想删除记录Y,我对X根本不感兴趣,所以X没有加载。
  • 你有对孩子而不是父母的约束吗?

标签: c# generics entity-framework-6


【解决方案1】:

尝试向 X 添加一个公共属性 YId 来保持与 Y 的连接, 这解决了我的问题,我将 Breeze 与 EF6 一起使用,但我遇到了同样的错误。

Class Y 
{
    public int Id { get; set; }
    public ICollection<X> Xs { get; set; }
}

Class X 
{
    public int Id { get; set; }
    public int YId { get; set; }   
    public Y Y { get; set; }
}

【讨论】:

    【解决方案2】:

    当您 context.Y.Attach(x); 时,请确保对象 x 持有父实体的“Id”。两者都需要。

    例子:

    x.Id = 3;
    x.ParentEntity.Id = 10;
    

    这至少解决了我的问题。我忘记了我附加的对象中的父 ID。

    【讨论】:

    • 如果你不介意,你会扩展这个答案来解释,一般来说,当延迟加载被禁用时会出现这个问题,如果你还没有调用context.y.Attach(x)?感谢您的回答。
    【解决方案3】:

    也许您必须在父实体 (X) 上允许 NULL 值,或者如果您不再使用该实体,则将其删除

    【讨论】:

      【解决方案4】:

      对我来说,我在数据库中的记录中的 FK 列有一个 NULL 值。我用有效值填充了该列,并且可以通过 EF Remove 方法删除记录。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-04-08
        • 2014-11-09
        • 2016-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-20
        相关资源
        最近更新 更多