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<News>
                {
                     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值:

6.linq to sql还是强大,只是资料太少了,想把linq to sql 搞很明白还是很困难。

转载于:https://www.cnblogs.com/dushouke/archive/2009/06/29/linq-to-sql-retake-Identity-value.html

linq to sql 插入值,以及如何取回自增的ID相关推荐

  1. vs2010 mysql linq to sql 系列_LINQ to SQL 系列 如何使用LINQ to SQL插入、修改、删除数据...

    LINQ和 LINQ to SQL 都已经不是一个新事物了,但是我接触的比较晚,本着绝知此事要躬行的态度,决定写这个系列. 本文使用的测试环境是VS 2010,和sql server 2005数据库. ...

  2. LINQ to SQL 系列 如何使用LINQ to SQL插入、修改、删除数据

    LINQ和 LINQ to SQL 都已经不是一个新事物了,但是我接触的比较晚,本着绝知此事要躬行的态度,决定写这个系列. 本文使用的测试环境是VS 2010,和sql server 2005数据库. ...

  3. 【Java】sql实现插入,插入值的主键自增,防止迁移数据时报主键冲突的错误;

    一.问题 我们要自己造一些测试数据,并且这些SQL脚本要迁移到其他环境,迁移过程中,如果主键写死,在其他环境,可能会出现主键冲突:所以,我们要写活的主键,实现起来也很简单: 二.解决方法 insert ...

  4. mybatis插入或更新语句返回自增逐渐id

    因为公司的表用的是自增id,而不是UUID,所以在好多时候都需要返回新插入的数据的id,所以在网上搜了一些方法,大部分都是用的xml方式来写的sql,不过本人是用的注解方式,方法比较少,所以写这篇文章 ...

  5. SQL Server:向 SQL Server 自增字段插入值 (转)

    SQL Server:向 SQL Server 自增字段插入值 [鹏城万里] 发表于 www.sqlstudy.com 通常情况下,不能向 SQL Server 自增字段插入值,如果非要这么干的话,S ...

  6. SQL Server数据库自增字段正确的插入值的描述

    我们今天主要向大家讲述的是SQL Server数据库之向SQL Server自增字段正确的插入值的实际操作步骤,在一般的情况下,我们不能向 SQL Server 数据库自增字段中插入值,如果非要这么干 ...

  7. sql语句往某个字段指定位置追加或者插入值

    sql语句往某个字段指定位置追加或者插入值 **业务场景:**需要对数据表中某个字段的值进行修改(对该字段的值进行插入字符串操作) 需要将materiel_features_pic字段值的'.png' ...

  8. 一步一步学Linq to sql(一):预备知识

    从今天起将推出新手讲堂,首先从linq开始详细讲解.一步一步学Linq to sql(一):预备知识 什么是Linq to sql Linq to sql(或者叫DLINQ)是LINQ(.NET语言集 ...

  9. LINQ to SQL活学活用(1):这要打破旧观念

    程序架构 如今比較经典的架构,看看以下图片. 怎样实现 在一个N层应用程序中我们怎样使用LINQ to SQL呢?这给刚刚入门的朋友的确是个难题,使用LINQ to SQL就是ORM技术,能够非常轻松 ...

最新文章

  1. 【零基础学Java】—抽象方法和抽象类(二十二)
  2. 频率分布直方图组距如何确定_频率分布有关的概念
  3. 如何在分组报表中实现组内数据补空行及组内页码
  4. java webview事件_捕获“页面已完成加载”事件,并使用xwalk Webview在ionic / cordova MainActivity.java中进行操作...
  5. netconsole 重定向kernel日志到远程服务器
  6. 3dsmax2021软件安装教程
  7. Win10磁盘分区工具-无损分区助手
  8. 解析几何 直线与平面 直线与平面(1.2)
  9. 7-95 深入虎穴 (树的深搜)
  10. 程序员和产品经理凡尔赛文学对话
  11. Java实现Apriori算法
  12. Nginx-http-flv-module流媒体服务器搭建+模拟推流+flv.js在前端html和Vue中播放HTTP-FLV视频流
  13. 20条技巧,让Chrome超越Firefox (2010-11-16更新)
  14. 全国计算机竞赛保送清华,全国数学奥赛金牌、保送清华,别人家的孩子了解一下...
  15. NLP入门概览(8) ——句法分析b:完全句法分析
  16. 使用easytrader时对xiadan.exe的配置
  17. 触发了慢日志告警应该怎么办
  18. 科普 | 生物多样性: 大自然的新陈代谢
  19. PZT-JH30/1压电薄膜极化实验机(30KV以下压电薄膜试样)
  20. JAVA 排行榜实现

热门文章

  1. 听说你,对薪酬待遇不太满意。。。
  2. 事件溯源|日志记录-一个基础的微服务模式
  3. 【Linux 报错】com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure The las
  4. vue项目-点击添加或者修改按钮浏览器的屏幕变黑,再次点击屏幕之后浏览器恢复正常(火狐浏览器、ChromeCoreLauncher双核浏览器)
  5. ui和android有联系,Android单位换算与UI适配
  6. php怎么定义索引,PHP未定义的索引/变量
  7. 初始化java工具失败,spring初始化失败解决办法
  8. python编辑器背景设置为黑色_GitHub 热榜:21 岁理工男开源的这个编辑器火了!...
  9. linux替换每个英文字开头为大写,shell脚本,文件里面的英文大小写替换方法。...
  10. ML:MLOps系列讲解之《MLOps原则之测试》解读