Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.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
Entity framework 实体框架链表_Entity Framework - Fatal编程技术网

Entity framework 实体框架链表

Entity framework 实体框架链表,entity-framework,Entity Framework,我有一个实体(我首先使用代码)看起来像: public class Node { public int ID { get; set; } public string SomeInfo { get; set; } public virtual Node Previous { get; set; } public virtual Node Next { get; set; } } 例如,保存下一个节点没有问题。但是,如果Previous的ID为1,并且我尝试将下一

我有一个实体(我首先使用代码)看起来像:

public class Node
{
    public int ID { get; set; }
    public string SomeInfo { get; set; }

    public virtual Node Previous { get; set; }
    public virtual Node Next { get; set; }
}
例如,保存下一个节点没有问题。但是,如果Previous的ID为1,并且我尝试将下一个节点(ID=1的节点)设置为2,则会引发此异常

无法将对象添加到对象上下文中。对象�s EntityKey有一个ObjectStateEntry,指示对象是 已经参与了一段不同的关系

我正在保存节点,如下所示:

int nextId;
int previousId;
if (int.TryParse(Request["previous"], out previousId))
   node.Previous = this.nodeRepository.GetSingle(previousId);

if (int.TryParse(Request["next"], out nextId))
   node.Next = this.nodeRepository.GetSingle(nextId);

this.nodeRepository.Update(node);
更新如下所示:

public virtual void Update(T entity)
{
    this.context.Entry(GetSingle(entity.ID)).State = EntityState.Detached;
    this.context.Entry(entity).State = EntityState.Added;
    this.context.Entry(entity).State = EntityState.Modified;

    this.Save();
}
public virtual T GetSingle(object id)
{
    var query = this.entities.Find(id);
    return query;
}
然后像这样单身:

public virtual void Update(T entity)
{
    this.context.Entry(GetSingle(entity.ID)).State = EntityState.Detached;
    this.context.Entry(entity).State = EntityState.Added;
    this.context.Entry(entity).State = EntityState.Modified;

    this.Save();
}
public virtual T GetSingle(object id)
{
    var query = this.entities.Find(id);
    return query;
}
更新1

包含异常的行位于更新方法中:

this.context.Entry(entity).State = EntityState.Modified;

您的上下文是否在使用块中,并在某个时候被处理?我遇到了类似的“无法将对象添加到对象上下文”错误。我会将上一个和下一个Id添加到模型中,并使用这些Id更新外键

public class Node
{
    public int ID { get; set; }
    public string SomeInfo { get; set; }

    public virtual Node Previous { get; set; }
    public int PreviousId { get; set; }
    public virtual Node Next { get; set; }
    public int NextId { get; set; }
}
要更新外键

int nodeId;  // I'm assuming you know the id of node you want updated.

int nextId;
int previousId;


using (var context = new Context()) 
{     
    // Perform data access using the context 
    var node = context.Nodes.find(nodeId);
    node.NextId = nextId;
    node.PreviousId = previousId;
    context.SaveChanges();
}

我认为问题在于一对一的关系。在这种情况下,EF只支持共享主键关联,这基本上意味着如果
Node.ID=1
,那么
Node.Previous.ID
Node.Next.ID
也必须是
1
。不可能有其他值。只能创建从节点到自身的循环,可以这么说。在哪一行你得到了异常?哪些值有
node.ID
previousId
nextId
当你得到异常时?实际上这似乎不是问题。场景是这样的:node.ID=2;node.previous.ID=1。现在我转到node.ID=1并尝试设置node.next.ID=2-只有在出现异常时才会抛出异常。您是否有任何与Fluent API(或数据批注)的映射?对于我来说,无法创建模型,我会遇到“无法确定关联的主体结束”异常。您使用的是哪个EF版本?我想问题在于您的EF设置。如果设置正确,则设置节点[id=2].previous.id=1,保存更改应导致节点[id=1].next.id=2,与EF设置一样,只有关系的一端应该设置另一端。但是,如果您的设置正确,请共享fluent API显示fluent API映射。问题在于FK关系是如何定义的,这是我的猜测。简单的回答是,您应该声明FK为多对多,即使逻辑上它们可能是单个或多个关系。