Связанный список Entity Framework - PullRequest
5 голосов
/ 22 марта 2012

У меня есть объект (я сначала использую код), который выглядит так:

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 равен 1, и я пытаюсь установить для следующего узла (который имеет ID = 1) значение 2, это исключение выдается.

Невозможно добавить объект в контекст объекта.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();
}

И GetSingle, как это:

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

ОБНОВЛЕНИЕ 1

Строка с исключением в методе обновления:

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

1 Ответ

0 голосов
/ 29 марта 2014

Находится ли ваш контекст в блоке Using и как-то удаляется? У меня были похожие ошибки «Объект не может быть добавлен к контексту объекта.

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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...