zoukankan      html  css  js  c++  java
  • [转]linq to sql 插入值,以及如何取回自增的ID

    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 搞很明白还是很困难。

    转自

    http://www.cnblogs.com/dushouke/archive/2009/06/29/linq-to-sql-retake-identity-value.html

  • 相关阅读:
    无向图求所有路径C#版
    centos 7 无痛安装 es
    rust 实现协程池
    spring boot fat jar 引入新的jar 文件到classpath
    nicolaka/netshoot 强大的容器网络问题解决工具
    使用nsenter 解决tcpcollect容器网络捕捉问题
    centraldogma git 镜像配置
    jmespath java 使用
    使用apicurio-registry 管理schema
    bfe 简单学习示例
  • 原文地址:https://www.cnblogs.com/4kapple/p/1951100.html
Copyright © 2011-2022 走看看