热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C#学习教程:使用LINQtoEntities将多个记录插入表的正确方法分享

使用LINQtoEntities将多个记录插入表的正确方法正如我们许多人所做的那样,我设置了一个简单的循环来从数据库添加多个记录。一个典型的例子是这样的:方法一:Alistofpr

使用LINQ to Entities将多个记录插入表的正确方法

正如我们许多人所做的那样,我设置了一个简单的循环来从数据库添加多个记录。 一个典型的例子是这样的:

方法一:

// A list of product prices List prices = new List { 1, 2, 3 }; NorthwindEntities NWEntities = new NorthwindEntities(); foreach (int price in prices) { Product newProduct = new Product(); newProduct.Price = price; NWEntities.Products.AddObject(newProduct); } NWEntities.SaveChanges(); 

然而,当我第一次设置循环时,我直观地写道:

方法二:

 Product newProduct = new Product(); foreach (int price in prices) { newProduct.Price = price; NWEntities.Products.Add(newProduct); } 

在做了一点阅读之后,有几个人提到如果使用方法II,则只会在表格中添加一条记录。 这似乎与直觉相反。 它是Add()函数,它加载一个新的插入,我认为,在每次调用后传入的数据都会创建一个对象。在循环声明我的Product对象似乎更好地利用资源,因为它是消耗的唯一开销。每次调用都是对象实例属性的重新赋值,而不是对象实例本身的重构。

有人可以澄清一下吗? 我找不到另一个直接处理这个问题的post。 如果有人在那里请指出它。

只需在循环中移动新产品的实例化。 您编写的代码将多次添加单个实例,这不会产生您所需的内容…您需要每个产品的单独实例… Add方法不会复制,它会将对象附加到上下文并标记它以便插入。

 foreach (int price in prices) { Product newProduct = new Product(); newProduct.Price = price; NWEntities.Products.Add(newProduct); } 

要了解发生了什么,请多考虑以下事项:

 class Program { static void Main(string[] args) { Console.WriteLine("Try to reuse same Instance:"); using (var ctx = new AdventureWorksEntities()) { List ids = new List {1, 2, 3}; Product p1 = new Product(); Product reference = p1; Product p2; Console.WriteLine("Start Count: {0}", ctx.Products.Count()); foreach (var id in ids) { p1.ProductID = id; p2 = ctx.Products.Add(p1); Console.WriteLine("p1 = p2 ? {0}", p1 == p2); Console.WriteLine("p2 = reference? {0}", p2 == reference); Console.WriteLine("State: {0}", ctx.Entry(p1).State); var changes = ctx.ChangeTracker.Entries(); Console.WriteLine("Change Count: {0}", changes.Count()); } } Console.WriteLine(); Console.WriteLine("Distinct Instances:"); using (var ctx = new AdventureWorksEntities()) { List ids = new List { 1, 2, 3 }; Product p2; foreach (var id in ids) { var p1 = new Product {ProductID = id}; p2 = ctx.Products.Add(p1); Console.WriteLine("p1 = p2 ? {0}", p1 == p2); Console.WriteLine("State: {0}", ctx.Entry(p1).State); var changes = ctx.ChangeTracker.Entries(); Console.WriteLine("Change Count: {0}", changes.Count()); } } Console.ReadLine(); } } 

在第一个循环中,您将重用相同的产品实例,但是当您将其添加到上下文时,您每次只使用相同的引用。 无论循环执行多少次,您都可以看到更改计数保持为1。 当然,如果你要调用ctx.SaveChanges(),只会保存最后的值。

在第二个版本中,每次更改计数都会正确递增,并且您将调用SaveChanges将保存所有不同的实体,如您所料。

+1对于Terryt的回答。 你需要坚持方法一或类似的东西。

在Entity framework 6版本中,有一种新方法可以在一个语句中添加一组数据。 这是AddRange方法 。

我想补充一点,当你想根据现有列表(或IEnumerable)添加实体时,我发现AddRange方法很优雅。

在你的情况下,可以这样做:

 NWEntities.Products.AddRange( Prices.Select(priceitem => new Product{price = priceitem}) ) 

在语义上,这应该类似于您的方法1.一个Product对象在价目表中按价格实例化。 但是有一个区别,它是匿名完成的,因此没有明确定义的引用变量指向新对象。

如果性能很重要,那么这个问题可能会为您提供更多信息: entity framework中最快的插入方式

希望这会给你一些帮助。

我们不需要循环的帮助。 我们可以通过linq做到这一点。 如下面的代码所示,名称必须从nameList添加到Employee表中,位字段为IsDeleted。

 db.Employee.AddRange( nameList.Select(name => new Employee { Name = name, IsDeleted = false }) ); 

我有类似的问题。 在我的问题中,我有这个代码:

  var cratelist = db.TruckContainerLoads.Where(x => x.TruckID == truckid).Select(x => x.ContainerID); if (!cratelist.Any()) { return; } foreach (var crateid in cratelist) { TruckContainerLoad crInstance = new TruckContainerLoad(); crInstance.COntainerID= crateid; try { db.TruckContainerLoads.Add(crInstance); db.SaveChanges(); } catch { return; } } 

我的查询只在我的foreach中添加了第一条记录。 问题是我需要在添加多个记录之后在foreach循环之外调用我的db.SaveChanges()。 对我来说,问题的答案实际上就在于问题。 所以,我正在提出这个问题。

上述就是C#学习教程:使用LINQ to Entities将多个记录插入表的正确方法分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—编程笔记


推荐阅读
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • EPPlus绘制刻度线的方法及示例代码
    本文介绍了使用EPPlus绘制刻度线的方法,并提供了示例代码。通过ExcelPackage类和List对象,可以实现在Excel中绘制刻度线的功能。具体的方法和示例代码在文章中进行了详细的介绍和演示。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • Python如何调用类里面的方法
    本文介绍了在Python中调用同一个类中的方法需要加上self参数,并且规范写法要求每个函数的第一个参数都为self。同时还介绍了如何调用另一个类中的方法。详细内容请阅读剩余部分。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 集合的遍历方式及其局限性
    本文介绍了Java中集合的遍历方式,重点介绍了for-each语句的用法和优势。同时指出了for-each语句无法引用数组或集合的索引的局限性。通过示例代码展示了for-each语句的使用方法,并提供了改写为for语句版本的方法。 ... [详细]
  • Day2列表、字典、集合操作详解
    本文详细介绍了列表、字典、集合的操作方法,包括定义列表、访问列表元素、字符串操作、字典操作、集合操作、文件操作、字符编码与转码等内容。内容详实,适合初学者参考。 ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
  • 在C#中,使用关键字abstract来定义抽象类和抽象方法。抽象类是一种不能被实例化的类,它只提供部分实现,但可以被其他类继承并创建实例。抽象类可以用于类、方法、属性、索引器和事件。在一个类声明中使用abstract表示该类倾向于作为其他类的基类成员被标识为抽象,或者被包含在一个抽象类中,必须由其派生类实现。本文介绍了C#中抽象类和抽象方法的基础知识,并提供了一个示例代码。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
author-avatar
mobiledu2502890657
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有