【问题标题】:I have a LINQ-to-Entities connection to a database - how do I insert data into that database?我有一个到数据库的 LINQ-to-Entities 连接 - 如何将数据插入该数据库?
【发布时间】:2011-02-08 06:11:06
【问题描述】:

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

问题是数据库很大——我不想为了插入而将整个数据库拉到内存中。

您推荐的将数据插入特定表的方法是什么?

更新:

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

更新:

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

【问题讨论】:

  • 天哪,您急需了解数据库和 SQL 的工作原理。因为这个问题的答案是“只需插入数据”。
  • 当您有多个需要与主键/外键同步的表时,并不是那么简单 - 请参阅blogs.msdn.com/b/efdesign/archive/2009/03/16/…

标签: sql linq-to-entities


【解决方案1】:

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

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

【讨论】:

  • 什么是“存储过程”?
  • Ups,存储过程...DB 电机具有允许直接与数据交互的编程语言。再次查看答案
  • 我宁愿不使用存储过程,因为它会锁定我使用 MSSQL。我宁愿使用 LINQ to Entities 或 ADO.NET 之类的东西,以便将来我可以根据需要使用不同的数据库。由于一切都在服务器上运行,因此互联网带宽不是问题,速度也不是问题,因为我们处理的数据不多。
【解决方案2】:

您无需查询任何内容即可进行插入。当使用实体框架进行插入时,LINQ 将不起作用。使用要创建的实体的 Create... 工厂方法。然后,将其添加到实体上下文并调用 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)

【讨论】:

  • 我应该澄清一下,我尝试插入的表与其他两个具有一对多关系的表相关联。我必须更新两个表中的主键和外键才能进行插入。有没有办法让框架为我们处理这个问题?
【解决方案3】:

是的。

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 定义为身份列。

【讨论】:

  • 这肯定越来越近了——但是有没有办法做到这一点而不必担心自己设置主键和外键?
  • @Gravitas:如果主键是标识列、自动递增列或通过其他机制自动分配,那么您不必设置它们。对于外键,您必须在实体框架内建立关联。没有关联,框架不知道哪些实体与哪些相关。如果主键是由数据库自动分配的,则该值将级联到数据模型中的相关外键字段,但您仍然需要关联才能使其正常工作。
  • 谢谢,感谢您的澄清。我现在有了答案 - 请参阅 stackoverflow.com/questions/4926561/…
  • 这是通用答案...请不要让问题悬而未决,如果您看到我做了关于身份列的声明(自动增量)
【解决方案4】:

【讨论】:

    猜你喜欢
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多