Entity Framework, внешние ключи и EntityKeys - PullRequest
3 голосов
/ 30 октября 2009

У меня проблема с Entity Framework и ForeignKeys. У меня есть таблица "BC_Message_Assets", которая имеет 3 FK (MessageId, AssetId и StatusId). Я создаю свой «MessageAsset», как это

MessageAsset messageAsset = new MessageAsset();

messageAsset.MessageStatusReference.EntityKey = new EntityKey("MyEntities.MessageStatusSet", "Id", 1);

messageAsset.AssetReference.EntityKey = new EntityKey("MyEntities.AssetSet", "Id", 1);

messageAsset.MessageReference.EntityKey = new EntityKey("MyEntities.MessageSet", "Id", messageId);

context.AddToMessageAssetSet(messageAsset);
context.SaveChanges();

Но я получил следующее исключение:

Оператор INSERT конфликтовал с ограничением FOREIGN KEY "FK_BC_Message_Assets_BC_Assets". Конфликт произошел в базе данных «Тест», таблице «dbo.BC_Assets», столбце «Id». Заявление было прекращено.

Когда я смотрю на запрос, я замечаю, что значение параметра AssetId равно "0", несмотря на то, что я предоставил "1" для EntityKey. Вот сгенерированный запрос:

exec sp_executesql N'insert dbo.[BC_Message_Assets]([MessageId], [AssetId], [CompletionTime], [StatusId]) values (@0, @1, null, @2) ',N'@0 int,@1 int,@2 int',@0=47,@1=0,@2=1

Я не могу объяснить, что происходит. Я жестко закодировал «1» в EntityKey и получил «0» в запросе?

Ответы [ 2 ]

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

У меня проблема с юнит-тестами.

Но я нашел причину проблемы. Проблема заключалась в том, что PK в моей таблице BC_Message_Assets был основан на 2 FK (MessageId и AssetId). С простым идентификатором (int + identity) он работает без проблем ... Странно!

0 голосов
/ 01 ноября 2009

Как вы говорите, вы запрограммировали 1,1,1, но получили 47,2,1

Это были 2 значения, которые не были ожидаемы.

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

Попробуйте написать модульный тест, используя только код в вашем вопросе.

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