'Y'中的实体参与了'FK_Y_X'关系。找到了0个相关的'X'。期望找到1个'X'。

14

我在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没有被加载。 - Stuart Blackler
你是否将约束条件放在子元素而非父元素上? - Jo Smo
4个回答

5
尝试在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; }
}

5
当你执行context.Y.Attach(x);时,请确保对象x持有父实体的“Id”。两者都是必需的。
例如:
x.Id = 3;
x.ParentEntity.Id = 10;

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


如果您不介意的话,能否扩展一下您的回答,以便更普遍地解释当禁用惰性加载时此问题会发生,并且如果您尚未调用 context.y.Attach(x),则应该这样做?感谢您的答复。 - Jared Beach

0

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


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接