Массовая вставка с EF ExecuteStoreCommand не работает, что не так? - PullRequest
0 голосов
/ 24 декабря 2010

Я использую SQL 2008 и EF У меня есть следующий сохраненный процесс для массовой вставки

CREATE Type [dbo].[xxx] as Table (
[ErrorCode] [nvarchar](10),
[ErrorMessage] [nvarchar](300),
[FieldName] [nvarchar](50),
[FieldLable] [nvarchar](300),
)
CREATE procedure dbo.InsertAll(@Records xxx READONLY)
as
begin

insert into dbo.MyTable
    select * from @Records;
end;
go

Я передаю Datatable как параметр (Type = структурированный), который имеет несколько записей. Этот процесс работает при вызове с использованием SQLCommand.ExecuteNonQuery, но ничего не делает при вызове с использованием contextObject.ExecuteStoreCommand.Возвращаемое значение = затронутые строки всегда 0

Что не так?такие процедуры не поддерживаются EF?Я даже не получаю никаких исключений: (* ​​1006 *

Обновление: после запуска трассировки SQL только что понял разницу в генерируемых операторах SQL

При использовании contextObject.ExecuteStoreCommand

declare @p3 dbo.xxx
insert into @p3 values(N'M',N'ErrorMsg - 0',NULL,NULL)
insert into @p3 values(N'M',N'ErrorMsg - 1',NULL,NULL)
insert into @p3 values(N'M',N'ErrorMsg - 2',NULL,NULL)
exec sp_executesql N'InsertAll',N'@Records [xxx]
READONLY',@Records=@p3

При использовании SQLCommand.ExecuteNonQuery

declare @p1 dbo.xxx
insert into @p1 values(N'M',N'ErrorMsg - 0',NULL,NULL)
insert into @p1 values(N'M',N'ErrorMsg - 1',NULL,NULL)
insert into @p1 values(N'M',N'ErrorMsg - 2',NULL,NULL)
exec InsertAll @Records=@p1

Как получить contextObject.ExecuteStoreCommand для выполнения того же SQL-запроса, что и SQLCommand.ExecuteNonQuery?

1 Ответ

1 голос
/ 20 января 2011

Я счел необходимым предоставить методы расширения, когда Entity Framework просто не будет работать для того, что я хочу. Хорошая часть - добавление расширения к объекту Context, как правило, избавляет вас от необходимости копаться в web.config или app.config для строки подключения. Тогда параметры и возвращаемые значения могут быть общими. Я лично видел довольно много красноречивых решений, использующих эту стратегию.

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