我有一个LINQ到实体连接到数据库 - 如何将数据插入该数据库?

时间:2011-02-07 16:32:16

标签: sql linq-to-entities

我想将数据插入到1GB大小的数据库中。我目前正在使用LINQ-to-Entities查询数据库。

问题是数据库很大 - 我不想将整个数据库拉入内存只是为了插入。

您推荐的方法是什么方法可以合理有效地将数据插入特定的表格?

更新

我应该澄清一点,我正在将数据插入到一个表中,该表链接到两个具有一对多关系的表。有没有让ADO框架处理主/外键关系更新的方法?

更新

找到正确答案,请参阅How do I use LINQ-to-Entities to insert data into a specific table?

4 个答案:

答案 0 :(得分:2)

您可以使用存储过程,因为数据量不足。或者你可以用数据创建一个文件,每行读取一行,然后用Linq每行插入行,这样数据就不会同时加载到内存中

为什么要使用存储过程?让我们来看看这项技术的主要优点: 预编译执行。 SQL Server编译每个存储过程一次,然后重新使用执行计划。当重复调用存储过程时,这会导致巨大的性能提升。 减少客户端/服务器流量。如果网络带宽是您环境中的一个问题,那么您将很高兴地了解到存储过程可以将长SQL查询减少到通过线路传输的单行。 高效重用代码和编程抽象。多个用户和客户端程序可以使用存储过程。如果您以有计划的方式使用它们,您会发现开发周期花费的时间更少。 增强安全控制。您可以授予用户独立于基础表权限执行存储过程的权限。 在MSSQL中,语言是Transact-SQL(T-SQL)。

答案 1 :(得分:1)

您无需查询任何内容即可执行插入操作。当使用实体框架进行插入时,LINQ将不起作用。使用要创建的实体的Create ... factory方法。然后,将其添加到实体上下文并调用SaveChanges()方法。

例如(vb.net),如果使用名为Orders的表/实体和名为OrderEntities的实体上下文:

Using context As New OrderEntities
    Dim order As Order = Order.CreateOrder(OrderNumber, Description, etc)
    context.AddToOrders(order)
    context.SaveChanges()
End Using

这将转换为数据库的INSERT语句。

这是一个非常简化的例子。您可能需要添加关联,执行验证等。但是,它说明您可以使用实体框架插入而不首先执行LINQ to Entities查询。

编辑:

该表位于该关系的一侧还是多方面?如果它位于一侧(主键表),则不需要执行任何操作,因为外键引用位于另一个表中。如果是多方(外键表),则在调用AddTo()方法之前,需要设置外键关联。

如果外键是加载到实体上下文中的实体,则可以直接设置:order.Customer = customer

但是,如果未从数据库加载,则可以设置EntityKey:order.CustomerReference.EntityKey = New EntityKey("OrderEntities.Customer", "CustomerID", 5)

答案 2 :(得分:0)

using(Entities context = new Entities() {
{
 Entity1 e1 = new Entity1{Id=-1, Name="E1"});
 Entity2 e2 = new Entity2{Id=-1, Name="E2", Entity1=e1});
 context.Entities2.AddObject(e2);
 context.SaveChanges();
}

我不确定您是否必须将e1添加到Entities1集合中。

为了实现这一点,您必须在表中将de Id定义为标识列。

答案 3 :(得分:0)