我可以在Entity Framework 4中使用SELECT等效项执行INSERT

时间:2011-01-13 19:12:59

标签: sql-server entity-framework entity-framework-4

我正在使用SQL Server将应用程序从SqlClient迁移到Entity Framework 4。我有一种情况,我必须从一个表复制几行到另一个表,所以我使用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

我可以使用实体框架完成与此类似的远程操作,或者我是否必须从Table2获取所有行,并在Table1中逐行插入它们?我怎么能处理GETDATE()?
TKS

4 个答案:

答案 0 :(得分:2)

将sql放在存储过程中,然后从你的应用程序中调用该存储过程 - 我只是使用普通的sql客户端进行调用来执行proc,但没有理由你不能将它映射到你的EF模型,如果你真的想,然后从EF调用它。

如果您愿意/需要,可以让它返回一个值。

答案 1 :(得分:1)

不,这不适用于EF。 EF会将所有选定的数据从DB加载到您的应用程序,将它们作为对象实现,并将这些对象逐个插入到第二个表中。 EF完全是unable to do batch operations

答案 2 :(得分:0)

如果您可以使用EF4的新CTP5功能版本,现在允许通过SqlQuery& S执行原始SQL查询和命令。 DbContext.Database上的SqlCommand方法。

答案 3 :(得分:0)

不,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中调用它。