Могу ли я сделать вставку с эквивалентом SELECT в Entity Framework 4 - PullRequest
6 голосов
/ 13 января 2011

Я переносю приложение из SqlClient в Entity Framework 4, работая с SQL Server.У меня есть ситуация, когда мне нужно скопировать несколько строк из одной таблицы в другую, поэтому я делаю это с помощью INSERT ... SELECT, как показано ниже:

INSERT INTO dbo.Table1 (Reg1, Reg2, Reg3, Reg4, Reg5, Reg6, Reg7, Reg8)
SELECT Reg1, Reg2, Reg3, Reg4, Reg5, @Reg6, GETDATE(), @Reg8
FROM dbo.Table2 
WHERE Reg1 = @Reg1

Могу ли я выполнить что-то удаленно подобноеEntity Framework, или мне нужно было бы получить все строки из таблицы 2 и вставить их строка за строкой в ​​таблицу 1?Как я могу обработать GETDATE ()?
Tks

Ответы [ 4 ]

2 голосов
/ 13 января 2011

Поместите sql в хранимую процедуру, а затем вызовите эту хранимую процедуру из вашего приложения - я просто использовал бы простой sql клиент, чтобы сделать вызов для выполнения proc, но нет причины, по которой вы не можете отобразить его в свой EF модель, если вы действительно хотели, а затем позвонить из EF.

Вы можете вернуть его, если хотите / нужно.

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

Нет, это не будет работать в EF. EF загрузит все выбранные данные из БД в ваше приложение, материализуя их как объекты, и вставит эти объекты одну за другой в таблицу. EF вообще не может выполнять пакетные операции .

0 голосов
/ 14 января 2011

Нет, EF4 не поддерживает массовые операции.

В вашем сценарии я бы создал определяемый пользователем тип таблицы в вашей базе данных, который имитирует таблицу dbo.Table1.*

Создайте хранимую процедуру, которая принимает этот UDT и выполняет вставку:

INSERT INTO dbo.Table1 (Reg1, Reg2, Reg3, Reg4, Reg5, Reg6, Reg7, Reg8)
SELECT Reg1, Reg2, Reg3, Reg4, Reg5, @Reg6, GETDATE(), @Reg8
FROM @UdtPassedIn

И вызывает это из обычного ADO.NET.

0 голосов
/ 14 января 2011

Если вы можете использовать новую версию CTP5 Feature EF4, теперь это позволяет выполнять необработанные SQL-запросы и команды через методы SqlQuery & SqlCommand в DbContext.Database.

...