EF4 - Принудительный порядок исполнения - PullRequest
3 голосов
/ 08 июля 2011

У меня есть три таблицы - Context, Session и User.И ниже приведена их упрощенная структура.

Пользователь:
UserId (Int, PK)
Email (Varchar (100))

Context:
ContextId (Int, PK)
UserId (Int, FK из таблицы пользователей)
CurrentSessionId (Int, Nullable, FK из таблицы сеансов)

Session:
SessionId (Int, PK)
UserId (Int, FK из таблицы User)
ContextId (Int, FK из таблицы Context)

Ниже приведена последовательность в моем коде дляудалить сущность пользователя.

1) Обновить таблицу CurrentSessionId для контекста до нуля, где UserId = UserId для удаления.
2) Удалить все сеансы, соответствующие пользователю
3) Удалить все контексты, соответствующиеПользователь
4) Окончательно удалить пользователя.
5) Вызвать ObjectContext.SaveChanges ()

При вызове ObjectContext.SaveChanges () я получаю следующее исключение -

Невозможно определить действительный порядок для зависимых операций.Зависимости могут существовать из-за ограничений внешнего ключа, требований модели или сгенерированных в хранилище значений.

Я полагаю, что EF4 запутывается, определяя порядок выполнения первых 3 операторов. Можно ли указать EF4, какие операторы выполнять первыми, а какие выполнять следующим?

Один из способов обойти это - вызвать SaveChanges () после первого шага, а затем вызвать его снова послеШаг четвертый.Но я хотел бы знать, есть ли другое элегантное решение, кроме этого.

Ответы [ 2 ]

4 голосов
/ 05 июня 2012

На основании этой ссылки MSDN порядок выполнения не может быть принудительно установлен в EF4.Мне пришлось вызывать SaveChanges () дважды после первого шага, а затем снова после четвертого.

0 голосов
/ 08 июля 2011

Я думаю, что проблема заключается в круговой ссылке между Session и Context; если вы избавитесь от Context.CurrentSessionId, то ваш сгенерированный объект Context все равно будет иметь свойство Sessions, которое вы можете использовать, но EF не должен расстраиваться, пытаясь согласовать зависимости. Вы можете вручную добавить свойство CurrentSession к Context следующим образом:

public Session CurrentSession
{
    get { return this.Sessions.FirstOrDefault(); }
}

Кроме того, если вы установите отношения User -> Context и User -> Session в вашей модели EF для каскадного удаления (или даже лучше в базе данных ), то удаление User станет всего двумя строками:

objectContext.Users.DeleteObject(user);
objectContext.SaveChanges();
...