博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Entity Framework添加记录时获取自增ID值
阅读量:5049 次
发布时间:2019-06-12

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

var m = new 你的Model();

db.你的Model.add(m);
db.SaveChange();
Response.Write(m.Id); //执行.SaveChange()保存后就直接可以取得id值了.
保存前没有id值. 

Entity Framework在将数据插入数据库时,如果主键字段是自增标识列,会将该自增值返回给实体对象对应的属性。

比如下面添加博客随笔至数据库的示例代码:

var blogPost = new BlogPost(){    Author = "博客园",    Title = "程序员的网上家园"};using (BlogDbContext context = new BlogDbContext()){    context.BlogPosts.Add(blogPost);                    context.SaveChanges();    return blogPost.ID;}

 SaveChanges()之后,blogPost.ID的值就是数据库中对应自增标识列的值。

看一下Entity Framework生成的SQL语句:

1 exec sp_executesql N'insert [dbo].[blog_Content]([Title],[Author])2 values (@0, @1)3 select [ID]4 from [dbo].[blog_Content]5 where @@ROWCOUNT > 0 and [ID] = scope_identity()',6 N'@0 nvarchar(128),@1 nvarchar(128),',@0=N'程序员的网上家园',@1=N'博客园'
View Code

EF通过scope_identity()获取自增列的值,而且我们没有对BlogPost的ID属性进行任何设置,是EF智能地判断出ID就是自增标识列。

在以前没有使用Entity Framework的时代,用的是存储过程,存储过程有一堆参数,实体对象的属性值要一一对应地赋值给这些参数,执行存储过程之后,还要通过ParameterDirection.Output的参数获取自增ID的值。

现在,只要把东西交给Entity Framework,并和她说,把它放到数据库中去。多省心!多快乐!

但是,自以为是的Entity Framework用这个特性给人快乐的同时,也给人带来了一点痛苦。她认为只要实体类中有ID属性,数据库对应的是一定是自增标识列,真是够自以为是的。当我们把博客随笔添加至数据库后,准备用这个自增ID将随笔内容添加至数据库(随笔内容存储在单独的数据库,通过ID字段与随笔进行关联,不是自增的),却出现错误提示:

1 Cannot insert the value NULL into column 'ID', 2 table 'CNBlogsText.dbo.blog_PostBody'; column does not allow nulls.
View Code

看看EF生成的SQL语句:

1 exec sp_executesql N'insert [dbo].[CNBlogsText_blog_PostBody]([Text])2 values (@0)3 select [ID]4 from [dbo].[CNBlogsText_blog_PostBody]5 where @@ROWCOUNT > 0 and [ID] = scope_identity()',N'@0 nvarchar(128)',@0=N'帮助程序员用技术改变世界'
View Code

不是自增列,也来个scope_identity()。这么聪明的Entity Framework,也会干这样的傻事。

还好,EF定制灵活的特性可以让我们轻松化解这个痛苦,只要在BlogDbContext中添加下面的代码:

protected override void OnModelCreating(DbModelBuilder modelBuilder){    modelBuilder.Entity
().Property(p => p.ID) .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); }

也可以通过在实体类属性上加标记实现:

public class BlogPost{    [DatabaseGenerated(DatabaseGeneratedOption.None)]    public int ID { get; set; }}

第二个痛苦是众所周知的Entity Framework不支持枚举类型,虽然大家都知道,但还是想拿出晒晒,解解恨。

EF怎么对待枚举类型的呢?对于实体类中实实在在存在的枚举类型的属性,EF对它们视而不见,就当它不存在。

对于这个痛苦,目前无法化解(要等EF的下一版本),只能借助旁边左道减轻痛苦,请看“旁边左道”之“移花接木”。

实体类中的代码:

public class BlogPost{    public BlogPostType PostType    {        get { return (BlogPostType)PostTypeEf; }        set { PostTypeEf = (int)value; }    }    public int PostTypeEf { get; set; }}

EF不认枚举类型,但认int类型,所以增加个PostTypeEf,仅供EF专用,等EF的下一版本支持枚举类型时再去掉。

转载于:https://www.cnblogs.com/love201314/p/4739314.html

你可能感兴趣的文章
C 字符串操作函数
查看>>
Makefile文件的使用
查看>>
接口测试工具-Jmeter使用笔记(一:运行一个HTTP请求)
查看>>
《BI那点儿事》数据流转换——逆透视转换
查看>>
JVM GC之垃圾收集算法
查看>>
Mybatis源码学习之资源加载(六)
查看>>
第一次配置react native
查看>>
5种常用的相关分析方法
查看>>
Mine Glass 原型
查看>>
Spark是什么
查看>>
K-mean matlab 实现代码
查看>>
登陆功能的实现
查看>>
8.Python爬虫实战一之爬取糗事百科段子
查看>>
延迟反应帮助他们避免了一些冲动消费有钱人喜欢讨价还价
查看>>
rsync+inotifywait
查看>>
C#中的线程(一)入门
查看>>
模板渲染引擎
查看>>
sql server2000 多用户操作数据表的问题(转)
查看>>
objective-C学习笔记(六)继承与多态
查看>>
[转]Android Studio常用快捷键
查看>>