Entity Framework 4.1 - EntityState по умолчанию для FK? - PullRequest
0 голосов
/ 05 августа 2011

У меня небольшая проблема с ASP.NET MVC и Entity Framework 4. У меня есть сущность с именем «UF», а другая - с именем «Pais», и у них есть это отношение:

UF [* ... 0..1] Pais

Я могу получить доступ к объекту Pais напрямую из UF, используя свойство навигации:

UF.Pais.Whatever = "foobar";

В настоящее время у меня есть представление, которое вставляет новый элемент в базу данных, и у него есть редактор для "Pais.Codigo" («Codigo» является первичным ключом для Pais).Поэтому, когда я вставляю новую UF, платформа создает экземпляр класса UF со ссылкой на экземпляр класса Pais.Затем это делается:

if (ModelState.IsValid)
{
    db.UFs.AddObject(uf);
    db.SaveChanges();

    return View();
}

Проблема в том, что EF вставляет новый Pais в базу данных, поэтому он в основном игнорирует существующий.

Например, если, скажем, мойОбъект UF имеет Pais с идентификатором 1. Текущее значение uf.Pais.Codigo равно 1. Другие атрибуты, такие как описание, в настоящее время нулевые.Когда я выполняю SaveChanges, оба «uf» и «uf.Pais» находятся в состоянии «Добавлено».Правильное состояние для "uf.Pais" должно быть неизменным, так как оно уже существует в базе данных.

Мой вопрос: есть ли способ изменить отношение по умолчанию EntityState для Не изменено?Следующий код решает проблему, но добавление его в каждую функцию с добавлением новой записи в базу данных (и для каждого FK) является излишним!

db.ObjectStateManager.ChangeObjectState(uf.Pais, EntityState.Unchanged);

Вот и все.Я не уверен, был ли я достаточно ясен.Не стесняйтесь спрашивать больше информации, если это необходимо.И извините за любые английские ошибки!

Спасибо,

Рикардо

PS: "Pais" означает "Страна" и "UF" - "State".

1 Ответ

0 голосов
/ 05 августа 2011

Мой вопрос: есть какой-то способ изменить отношение по умолчанию EntityState для Unchanged?

Да, вызывая Attach вместо Unchanged.

Следующий код решает проблему, но добавляет ее к каждой функции with добавляет новую запись в базу данных (и для каждого FK) излишне!

Нет, это не излишество, это решение, потому что либо Attach, либо AddObject всегда будет выполнять операцию для всех сущностей и ассоциаций в графе сущностей. Это означает, что вызов AddObject сделает все, о чем еще не знает контекст, поскольку Added, а Attach сделает все, о чем не знает контекст, как Unchanged (так что вам, в свою очередь, придется устанавливать каждый измененный или вставлен объект в правильное состояние). Так работает EF, если вы используете отдельные сущности.

Другим решением проблемы является установление соединения после добавления UF:

// Here UF.Pais is null
db.UFs.AddObject(uf);
// Create dummy Pais
var pais = new Pais { Id = "Codigo" };
// Make context aware of Pais
db.Pais.Attach(pais);
// Now make the relation
uf.Pais = pais;
db.SaveChanges();

Если вы работаете с отсоединенными сущностями, вы всегда отвечаете за установку правильного состояния для каждой сущности независимая ассоциация ). Таким образом, вы будете либо использовать прикрепленные сущности, чтобы позволить EF создать для вас магию (как показано в примере), либо использовать подход, который вам не нравится. В более сложных сценариях вы можете обнаружить, что наилучшим подходом является повторная загрузка графа сущностей и объединение входящих изменений в прикрепленный граф.

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