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

linqtosql插入值以及如何取回自增的ID

linqtosql在插入值的时候还是很方便。有时候我们需要在插入一个新实体之后得到那个实体的主键ID的值,这个ID当然必须是自增。一段时间我一直认为直接使用linqt

linq to sql 在插入值的时候还是很方便。有时候我们需要在插入一个新实体之后得到那个实体的主键ID的值,这个ID当然必须是自增。一段时间我一直认为直接使用linq to sql的插入机制是不可以在做到的,所以只有使用存储过程的,具体可以查看这篇文章:http://blog.benhall.me.uk/2008/01/custom-insert-logic-with-linq-to-sql.html,但是总是觉得这样太麻烦了。通过观察linq to sql插入之后产生的sql发现,它自动生成了两条语句,一条insert,一条select,而且那条select正好就是查询的最后生成的主键ID,真是不可思议呀。。

下面以一个实际的代码演示一下:

1.新建一个新闻表:

列名             数据类型                        允许为NULL         默认值             主键
----------------------------------------------------------------------------
ID                 int                                                       自增                是
Title              nvarchar(200)                                   
PubDate        datetime                                              getdate()     
Tag               nvarchar(200)                 是                

2.通常的做法就是新建一个Linq to sql 的类文件,然后通过可视化设计器把数据表拖到设计器中,但是这样一"托"永逸的做法是根本不行的,还要需要修改一些地

方,数据库中默认值的字段除了主键在自动生成的linq to sql的类文件中所对应的属性上面的列特性是没有标记IsDbGenerated=true的,这一点是必须要修改的。

在本例中要修改的就是在Pubdate属性把IsDbGenerated=true添加上,当然也可以在可视化的方式修改:

3.下面就来测试linq to sql 中插入值所产生的sql语句:

using (DemoDataContext db = new DemoDataContext())
            {
                db.Log = new WebApp.DataServer.DebuggerWriter();
                News news = new News { Title = "测试" };
                db.News.InsertOnSubmit(news);
                db.SubmitChanges();
            }

对应产生的sql语句:

看的很清楚一条insert ,一条select   ,注意select中的字段正式设置了默认生成的字段。如果我们不想让设置了默认值的字段不出现在select语句中我们可以那那个属性上的Column特性上设置AutoSync=AutoSync.Never,比如我们在本例中的Pubdate字段的属性上设置AutoSync=AutoSync.Never,则生成的语句的select字段中就不会出现Pubdate:

4.解决问题:

linq to sql   在插入值的时候会"无缘无故"的时候会产生select语句,真的很神奇,这个select并不是没有用的,从select的意思我们可以看出他正好查询了我们想要的字段的值,但是怎么得到他们呢,明明查询了,现在有什么办法可以得到呢?其实很简单:

using (DemoDataContext db = new DemoDataContext())
            {
                db.Log = new WebApp.DataServer.DebuggerWriter();
                News news = new News { Title = "测试" };
                db.News.InsertOnSubmit(news);
                db.SubmitChanges();
int newsID = news.ID;
            }

就是在提交之后访问那个刚刚插入的实体的ID属性就可以了。

5.下面我们测试一下,如果批量添加能不能得到那些自增的ID?

代码:

using (DemoDataContext db = new DemoDataContext())
            {
                db.Log = new WebApp.DataServer.DebuggerWriter();
                var newsList = new List
                {
new News{Title="测试1"},
new News{Title="测试2"},
new News{Title="测试3"},
                };
                db.News.InsertAllOnSubmit(newsList);
                db.SubmitChanges();
                var IDList = newsList.Select(n => n.ID);
            }

  下面是生成的Sql语句:

下面是监视IDList的结果,真是每个新插入数据的ID值:

×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××

第二篇文章:

就是有一个表中有一个字段为ID,并设置为Identity自动增长值,我们在为这样的表添加记录时,我们是不用给定ID值的。但是在使用Linq来添加记录时,会出现一些问题,就是每次添加新记录时,如果不给定ID号,那么它就会自动给ID一个0值,而ID是主键,当然不能重复,这样就导致如果不给定ID值,就只能自动添加一条记录,而且ID的值为0。

为了解决这个问题,我到网上找了好多资料,基本上没找到解决方法,最后一开窍,试着用英文关键字linq identity_insert到谷歌里面搜索,结果还真让我找到了。

原文如下:


There is a property of Column attribute (of System.Data.Linq.Mapping namespace) called IsDbGenerated. When you add this property for a Column and set it to true, it says the DataContext that column will be filled by the database i.e. its value will be generated by the database. This is very useful for Identity Columns. In this case, you also donot required to set the IDENTITY_INSERT on. So, suppose we have an identity column say "UserID", and we want to insert a row in our database table named say "TestTable". The code to do this is as follow
//In the class TestTable (which is mapped for LINQ)
[Column (Name="UserID",IsDbGenerated=true,DbType="int Not Null IDENTITY")]
public int UserID
{

get;
set;

}
//In the class where you want to insert row into table TestTable
TestDBDataContext tdb=new TestDBDataContext(ConnString);
tdb.TestTable.InsertOnSubmit(newRow);
tdb.SubmitChanges();
In this way you can insert a new row.


我的实践证明,只要在

[Column (Name="UserID",DbType="Int Not Null")]

行中加一个IsDbGenerated=true就可以了。

[Column (Name="UserID",IsDbGenerated=true,DbType="int Not Null IDENTITY")]

转:https://www.cnblogs.com/axyz/archive/2011/03/08/1977419.html



推荐阅读
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 导航栏样式练习:项目实例解析
    本文详细介绍了如何创建一个具有动态效果的导航栏,包括HTML、CSS和JavaScript代码的实现,并附有详细的说明和效果图。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 深入理解Tornado模板系统
    本文详细介绍了Tornado框架中模板系统的使用方法。Tornado自带的轻量级、高效且灵活的模板语言位于tornado.template模块,支持嵌入Python代码片段,帮助开发者快速构建动态网页。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 主要用了2个类来实现的,话不多说,直接看运行结果,然后在奉上源代码1.Index.javaimportjava.awt.Color;im ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • Python自动化处理:从Word文档提取内容并生成带水印的PDF
    本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • 本文详细记录了在基于Debian的Deepin 20操作系统上安装MySQL 5.7的具体步骤,包括软件包的选择、依赖项的处理及远程访问权限的配置。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 本文详细介绍了如何解决Uploadify插件在Internet Explorer(IE)9和10版本中遇到的点击失效及JQuery运行时错误问题。通过修改相关JavaScript代码,确保上传功能在不同浏览器环境中的一致性和稳定性。 ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
author-avatar
爱夫777
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有