Как установить значение столбца FK без извлечения его - PullRequest
0 голосов
/ 26 ноября 2009

Я хочу установить новое значение для моего столбца FK объектов сущностей, но не могу найти свойство для установки. Я не хочу получать записи из БД.

У меня есть ДБ, как это

Таблицы БД:

Concept                ConceptType
-Id (PK)               -Id(PK)
-Name                  -Name
-ConceptTypeId(FK) (ALLOW NULL)

Код:

Concept conceptToUpdate = new Concept() { Id = 1 };
ConceptType conceptType = new ConceptType() { Id = 5 };
db.AttachTo("Concept", conceptToUpdate);
db.AttachTo("ConceptType", conceptType);
conceptToUpdate.ConceptType = conceptType;
db.SaveChanges();

Этот код работает, если столбец ConceptTypeId (FK) ранее был равен NULL. Если это не NULL, это дает исключение. Я отслеживаю SQL-запрос, проблема в SQL-запросе, потому что он проверяет, что старое значение NULL: S

SQL QUERY: (из SQL Profiler)

exec sp_executesql N'update [dbo].[Concept]
set [ConceptTypeId] = @0
where (([Id] = @1) and [ConceptTypeId] is null)
',N'@0 int,@1 int',@0=5,@1=1

1 Ответ

1 голос
/ 27 ноября 2009

Причина сбоя заключается в том, что в 3.5 с пакетом обновления 1 (SP1) то, что для отношений старое значение FK является частью проверки параллелизма, как вы обнаружили с помощью профилировщика SQL.

Что вам нужно, это что-то вроде этого:

Concept conceptToUpdate = new Concept() {
      Id = 1 , 
      ConceptType = new ConceptType {Id = OriginalFKValue}
};
ConceptType conceptType = new ConceptType() { Id = 5 };
db.AttachTo("Concept", conceptToUpdate); 
db.AttachTo("ConceptType", conceptType);
conceptToUpdate.ConceptType = conceptType;
db.SaveChanges();

Это означает, что вам нужно знать не только Id того, что вы хотите обновить, но также и его оригинальные значения FK, что, конечно, является реальной болью.

Отсюда новая функция в EF 4.0, называемая FK Associations. При использовании ассоциаций FK исходное значение FK составляет , а не часть проверки параллелизма.

Надеюсь, это поможет

Alex

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