Entity Framework: избегайте многократного сохранения для циклических ссылок - PullRequest
0 голосов
/ 23 апреля 2011

Я получаю это исключение при вызове SaveChanges для моего EF ObjectContext:

Unable to determine a valid ordering for dependent operations. Dependencies may exist due to foreign key constraints

Я думаю, что проблема в том, что у меня круговая зависимость от моей модели БД.

т.е.

Таблица пользователей

  • Id
  • ProfilePictureId

Настольные рисунки

  • Id
  • UserId

Я создаю нового пользователя и настраиваю картинку

var user = _db.Users.CreateObject();
var picture = _db.Pictures.CreateObject();

picture.User = user;
user.ProfilePicture = picture;

_db.SaveChanges();

Но это исключение.

Если я добавлю дополнительный вызов к SaveChanges () после того, как я установил пользователя изображения. Это работает просто отлично, я просто хочу избежать этого двойного обращения к БД.

Есть идеи, как этого добиться?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 23 апреля 2011

Невозможно избежать двухкратного вызова SaveChanges при разработке вашей базы данных.Вы не можете вставить пользователя с зависимостью от картинки, которая еще не вставлена ​​(FK сгенерирует исключение), и в то же время вы не можете вставить картинку с зависимостью от пользователя, которая еще не вставлена ​​(снова FK сгенерирует исключение).Это не та особенность EF, которая есть в самой БД.

Вам также не нужно избегать множественных вызовов SaveChanges из-за множественных обращений.EF не имеет пакетирования команд, поэтому каждая вставка, обновление или удаление в любом случае имеет свою собственную обратную передачу в базу данных.

Если вы хотите вызвать один SaveChanges, вы должны изменить свою базу данных следующим образом:

Таблица пользователей

  • Id (PK, IDENTITY)

Табличные рисунки

  • Id (PK, FK для Users.Id, без IDENTITY)

Это собственное отношение один к одному, где User является главным иИзображение зависит.

0 голосов
/ 23 апреля 2011

Я бы сказал, что достаточно выполнить назначение один раз (либо для настройки пользователя, либо для изображения), то есть:

var user = _db.Users.CreateObject();
var picture = _db.Pictures.CreateObject();

user.ProfilePicture = picture;

_db.SaveChanges();

Вы создаете новые сущности в первых двух строках и «связываете» их с помощью user.ProfilePicture = picture. EF должен справиться с остальными.
Вам не нужно устанавливать отношения с обеих сторон.

Редактировать: Как насчет этого?

var user = _db.Users.CreateObject();
var picture = _db.Pictures.CreateObject();

picture.user = user;
user.ProfilePictureId = picture.Id;


_db.SaveChanges();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...