LINQ更新:找不到行或行已更改

LINQ更新:找不到行或行已更改,第1张

产生此异常,主要是Linq缓存数据和实际数据库数据不一致的情况造成。解决次问题的情况,主要有几种:

1比较简单的方法,不使用Linq提供的SubmitChanges()方式提交更改,而直接执行SQL语句,例如:

dbExecuteCommand("Update [dbo][LinqTest] SET Age=25 Where ID = @p0", 1);

这样虽然比较方便,但是感觉又回到了直接写SQL的时代,毕竟Linq to SQL的目的,就是为了让我们看不见SQL,避免写复杂的SQL语句,而直接 *** 作实体对象,这样也可以避免程序可读性差、不便于维护。所以除非万不得已,还是不太推荐使用此方法。

2参考MSDN的资料,采用Linq提供的解决更新冲突的方法,在异常中捕获冲突,然后手动解决冲突:

try

{

dbSubmitChanges(SystemDataLinqConflictModeContinueOnConflict);

}

catch (SystemDataLinqChangeConflictException ex)

{

foreach (SystemDataLinqObjectChangeConflict occ in dbChangeConflicts)

{

//以下是解决冲突的三种方法,选一种即可

// 使用当前数据库中的值,覆盖Linq缓存中实体对象的值

occResolve(SystemDataLinqRefreshModeOverwriteCurrentValues);

// 使用Linq缓存中实体对象的值,覆盖当前数据库中的值

occResolve(SystemDataLinqRefreshModeKeepCurrentValues);

// 只更新实体对象中改变的字段的值,其他的保留不变

occResolve(SystemDataLinqRefreshModeKeepChanges);

}

// 这个地方要注意,Catch方法中,我们前面只是指明了怎样来解决冲突,这个地方还需要再次提交更新,这样的话,值 //才会提交到数据库。

dbSubmitChanges();

}

1任何集合类对象都有一个GetEnumerator()方法,该方法可以返回一个实现了 IEnumerator接口的对象,这个返回的IEnumerator对象既不是集合类对象,也不是集合的元素类对象,它是一个独立的类对象。通过这个对象,可以遍历访问集合类对象中的每一个元素对象2 DataTable dt = GetDetails()Tables[0];//获取可用的DataTable// var m = dtAsEnumerable()Last<DataRow();返回DataTable最后一行DataRow//var m = dtAsEnumerable()First<DataRow();返回DataTable第一行DataRow//var m = dtAsEnumerable()Count<DataRow();返回DataTable总行数//var m = dtAsEnumerable()ElementAt<DataRow(TipIndex);返回DataTable 第TipIndex条的DataRow//var m = dtAsEnumerable()Reverse<DataRow();对DataTable反向排序//var m = dtAsEnumerable()Skip<DataRow(TipIndex);跳过DataTable前TipIndex条var m = dtAsEnumerable()Take<DataRow(TipIndex);//提取DataTable前TipIndex条DataTable T = mCopyToDataTable<DataRow();其中最后一个未注释的是经常用到的,可以用来提取前N行,类似于SQL中的Top N3to sql(或者叫DLINQ)是LINQ(NET语言集成查询)的一部分,全称基于关系数据的 NET 语言集成查询,用于以对象形式管理关系数据,并提供了丰富的查询功能,它和Linq to xml、Linq to objects、Linq to dataset、Linq to entities等组成了强大的LINQ。要学好LINQ查询语法,就不得不先理解C# 30的一些新特性,下面一一简单介绍

     LINQ to Entities 是 LINQ 中最吸引人的部分。它让你可以使用标准的 C# 对象与数据库的结构和数据打交道。使用 LINQ to Entities 时,LINQ 查询在后台转换为 SQL 查询并在需要数据的时候执行,即开始枚举结果的时候执行。LINQ to Entities 还为你获取的所有数据提供变化追踪,也就是说,可以修改查询获得的对象,然后整批同时把更新提交到数据库。

       LINQ to Entities 是 Entity Framework 的一部分并且取代 LINQ to SQL 作为在数据库上使用 LINQ 的标准机制。Entity Framework 是行业领先的对象-关系映射(ORM)系统。可以和多种数据库一起使用,并支持各种灵活、复杂的数据模型。

注:

       微软把开发的重点从 LINQ to SQL 转移到了 LINQ to Entities,并且宣布 LINQ to SQL 不再提供更新,LINQ to SQL 现在仍被支持单不推荐。

       LINQ to Entities 是一项令人印象深刻的技术,但对大多数开发人员而言只是一个小的进步。和 DataSet 一样,ASPNET 开发人员使用 LINQ 的查询特新远多于它的批量更新特性。这是因为通常 Web 应用程序的更新是单次的而不是批量的。他们更愿意在页面回发时立刻执行更新,同时可以获得原始值和新(更新)值,这使得通过 ADONET 命令提交更新更加方便。

       简而言之,LINQ to Entities 没有提供任何不能用 ADONET代码、自定义对象、LINQ to Objects 实现的特性,但是有时出于某些原因而需要考虑使用 LINQ to Entities:

更少的代码。不必编写查询数据库的 ADONET 代码,可以通过一个工具生成需要的数据类。

灵活的查询能力。不必拼凑 SQL 语句,而是使用 LINQ 查询模型。一致的查询模型可访问众多不同的数据源(从数据库到 XML)。

变更追踪以及批量更新。可以对查询的数据进行多项修改并提交批量更新,这不需要编写任何 ADONET 代码。

生成数据模型

       Entity Framework 依赖于一个数据模型来使用 LINQ to Entities 进行查询。表中的行被转换为 C# 对象的实例,表的列是这些对象的属性。数据库架构和数据模型对象的映射是 Entity Framework 的核心

       为了生成模型,右击 App_Code 目录,单击“添加新项”,“ADONET 实体数据模型”,设置创建的文件名称后(这里是 NorthwindModeledmx),单击“确定”。

       从一个已经存在的数据库生成模型,即微软的 Northwind 示例数据库。配置数据库连接,并可以选择表、视图、和存储过程。还可以选择使用复数还是单数形式的对象名(例如,Products 表的行被命名为 Product )、是否包含外键关系等。这里选择全部表并选中“所生成对象的单复数形式”。

       Visual Studio 会为你选择的数据库元素创建模型图,它显示了已经创建的映射对象、对象拥有的字段以及对象之间的关系。

       项目中新增了下面这两个文件:

NorthwindModeledmx:这个XML文件定义数据库模型的架构。

NorthwindModelDesignercs:这个C#代码文件包含数据模型的映射对象。

数据模型类

       我们将把大部分时间花在 NorthwindModelDesignercs这个文件上。因为它包含了我们要用于 LINQ to Entities 查询的数据类型。(这个文件会被数据模型重新生成,因此不应该也不必要手工去修改这个文件,你的修改会丢失。)

       打开该文件,可以看到有两段代码区域:Contexts 和 Entities 。

1 派生的对象上下文

       NorthwindModelDesignercs文件中定义的第一个类从 ObjectContext 派生,其名称是 NorthwindEntities 。这个类的构造函数连接到所生成模型的数据库,或者你也可以指定连接字符串连接到其他数据库(必须具有相同的架构,否则模型无法工作)。

       下面是一个简单的示例:

protectedvoidPage_Load(objectsender, EventArgs e)

{

NorthwindEntities db = newNorthwindEntities();

GridView1DataSource = dbProducts

linq是面向对象的sql。也就是说,sql是向关系型数据库的查询,而linq实际上是对内存里的数据的查询。

虽然linq原来是对象查询,但经过ms的努力,可以通过表达式分析与实体到关系的映射(linq

to

sql),把linq转换为sql语句或是对xml的查询(linq

to

xml)。

因此,这种技术就成了对象到数据库记录的一个方便的映射、转化与 *** 作的工具,你再也不必去去根据不同的情况用字符串拼接的办法生成sql,而是专心于对象模型的处理即可,你对于对象的修改最终都会被转换为对应的update,

insert,

delete等sql语句,在你submit时全部提交到数据库中。

综尔言之,linq

to

sql是一个数据库到对象结构的一个中间层,

他把对关系数据的管理转变为对象的 *** 作,屏蔽了麻烦的sql,而且,还可以得到vs强大的智能感知功能的帮助。

以上就是关于LINQ更新:找不到行或行已更改全部的内容,包括:LINQ更新:找不到行或行已更改、C# 中的GetEnumerator方法,C# DataTable几个常用的查询表达式,C#的lINQ怎么用干什么用的、Linq to Entity怎么用讲解下等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9690587.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-01
下一篇2023-05-01

发表评论

登录后才能评论

评论列表(0条)

    保存