博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[转]linq to sql 插入值,以及如何取回自增的ID
阅读量:5740 次
发布时间:2019-06-18

本文共 2028 字,大约阅读时间需要 6 分钟。

linq to sql 在插入值的时候还是很方便。有时候我们需要在插入一个新的实体之后得到那个实体的主键ID的值,这个ID当然必须是自增。一段时间我一直认为直接使用 linq to sql的插入机制是不可以在做到的,所以只有使用存储过程的,具体可以查看这篇文章:,但是总是觉得这样太麻烦了。通过观察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/4kapple/archive/2011/02/11/1951100.html

你可能感兴趣的文章
windows下常用命令
查看>>
1.5编程基础之循环控制_29:数字反转
查看>>
组策略 之 设备安装设置
查看>>
人工智能还能干这些?这8种AI应用你可能意想不到
查看>>
实现Hyper-V 虚拟机在不同架构的处理器间迁移
查看>>
简单使用saltstack
查看>>
针对web服务器容灾自动切换方案
查看>>
突破媒体转码效率壁垒 阿里云首推倍速转码
查看>>
容器存储中那些潜在的挑战和机遇
查看>>
R语言的三种聚类方法
查看>>
55%受访企业将物联网战略视为有效竞争手段
查看>>
深入理解Python中的ThreadLocal变量(上)
查看>>
如果一切即服务,为什么需要数据中心?
查看>>
《游戏开发物理学(第2版)》一导读
查看>>
Erlang简史(翻译)
查看>>
深入实践Spring Boot2.4.2 节点和关系实体建模
查看>>
信息可视化的经典案例:伦敦地铁线路图
查看>>
10个巨大的科学难题需要大数据解决方案
查看>>
Setting Up a Kerberos server (with Debian/Ubuntu)
查看>>
用 ThreadLocal 管理用户session
查看>>