在EF中,我们建立数据模型的时候,可以给属性配置数据生成选项DatabaseGenerated,它后有三个枚举值:Identity、None和Computed。

Identity:自增长

None:不处理

Computed:表示这一列是计算列。

在EF中,如果主键是int类型,Code First生成数据库的时候会自动设置该列为自增长。但如果主键是Guid类型,我们就要手动的去设置了。

对于下面的模型,如果我们没有设置自增长,数据库中会以0来填充

  1. public class Person
  2. {
  3. [Key]
  4. public Guid SocialSecurityNumber { get; set; }
  5. public string FirstName { get; set; }
  6. public string LastName { get; set; }
  7. }
  1. var person = new Person
  2. {
  3. FirstName = "Rowan",
  4. LastName = "Miller",
  5. };
  6. using (var context = new BreakAwayContext())
  7. {
  8. context.People.Add(person);
  9. context.SaveChanges();
  10. }

插入第二条记录的时候就会报错了。所以,下面的模型设置才是正确的。

  1. public class Person
  2. {
  3. [Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)]
  4. public Guid SocialSecurityNumber { get; set; }
  5. public string FirstName { get; set; }
  6. public string LastName { get; set; }
  7. }

现在我们来看看有些情况配置为None也是有用的。修改一下上面的模型。

  1. public class Person
  2. {
  3. [Key]
  4. public int SocialSecurityNumber { get; set; }
  5. public string FirstName { get; set; }
  6. public string LastName { get; set; }
  7. }

我们再插入一条记录看看

  1. var person = new Person
  2. {
  3. FirstName = "Rowan",
  4. LastName = "Miller",
  5. SocialSecurityNumber = 12345678
  6. };
  7.  
  8. using (var context = new BreakAwayContext())
  9. {
  10. context.People.Add(person);
  11. context.SaveChanges();
  12. }

在数据库中存储的是1,并不是我们所想要的12345678.这是为什么呢?

因为主键是SocialSecurityNumber是Int类型,Code First在数据库中对该列作自增长处理。这时,我们想再插入自定义的SocialSecurityNumber就不行了。

所以当我们想这样做时,就应该把SocialSecurityNumber的自增长配置为None.

  1. public class Person
  2. {
  3. [Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
  4. public int SocialSecurityNumber { get; set; }
  5. public string FirstName { get; set; }
  6. public string LastName { get; set; }
  7. }

如果对属性标识为Computed,EF会认为该列是通过其它列计算得出的,不会将其持久化到数据库中。

  1. public class Person
  2. {
  3. [Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
  4. public int SocialSecurityNumber { get; set; }
  5. public string FirstName { get; set; }
  6. public string LastName { get; set; }
  7. [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
  8. public string Name { get; set; }
  9. }
  1. var person = new Person
  2. {
  3. FirstName = "Rowan",
  4. LastName = "Miller",
  5. SocialSecurityNumber = 1231478,
  6. Name = "Rowan Miller",
  7. };
  8.  
  9. using (var context = new BreakAwayContext())
  10. {
  11. context.People.Add(person);
  12. context.SaveChanges();
  13. }

查看数据库,我们看到Name并没有存储任何值。

如果我的文章对你有帮助,就点一下推荐吧.(*^__^*)

Entity Framework 数据生成选项DatabaseGenerated【转】的更多相关文章

  1. Entity Framework 数据生成选项DatabaseGenerated

    在EF中,我们建立数据模型的时候,可以给属性配置数据生成选项DatabaseGenerated,它后有三个枚举值:Identity.None和Computed. Identity:自增长 None:不 ...

  2. Entity Framework 数据生成选项DatabaseGenerated(转)

    在EF中,我们建立数据模型的时候,可以给属性配置数据生成选项DatabaseGenerated,它后有三个枚举值:Identity.None和Computed. Identity:自增长 None:不 ...

  3. Visual Studio Entity Framework (EF) 生成SQL 代码 性能查询

    Visual Studio Entity Framework (EF) 生成SQL 代码 性能查询     SQL 中,有SQL Server Profiler可以用来查询性能以及查看外部调用的SQL ...

  4. "Entity Framework数据插入性能追踪"读后总结

    园友莱布尼茨写了一篇<Entity Framework数据插入性能追踪>的文章,我感觉不错,至少他提出了问题,写了出来,引起了大家的讨论,这就是一个氛围.读完文章+评论,于是我自己也写了个 ...

  5. Entity Framework Core生成的存储过程在MySQL中需要进行处理及PMC中的常用命令

    在使用Entity Framework Core生成MySQL数据库脚本,对于生成的存储过程,在执行的过程中出现错误,需要在存储过程前面添加 delimiter // 附:可以使用Visual Stu ...

  6. Entity Framework 自动生成CodeFirst代码

    前言 在前面的文章中我们提到Entity Framework的“Code First”模式也同样可以基于现有数据库进行开发.今天就让我们一起看一下使用Entity Framework Power To ...

  7. Entity Framework查询生成大量的子查询,如何避免?求救

    最近使用Entity Framework做一个中型的项目,一张表含有千万条数据,并没有使用很复杂的查询,只是程序上使用了DTO进行帅选数据,且使用了分页,效果很不理想.经过跟踪sql,我发现很多简单的 ...

  8. asp.net mvc常用的数据注解和验证以及entity framework数据映射

    终于有时间整理一下asp.net mvc 和 entity framework 方面的素材了. 闲话少说,步入正题: 下面是model层的管理员信息表,也是大伙比较常用到的,看看下面的代码大伙应该不会 ...

  9. .NET基础篇——Entity Framework 数据转换层通用类

    在实现基础的三层开发的时候,大家时常会在数据层对每个实体进行CRUD的操作,其中存在相当多的重复代码.为了减少重复代码的出现,通常都会定义一个共用类,实现相似的操作,下面为大家介绍一下Entity F ...

随机推荐

  1. ZT c++ 中的重载全局new,delete

    c++ 中的重载全局new,delete 分类: c++ 2010-08-06 10:31 116人阅读 评论(1) 收藏 举报 deletec++file编译器语言工作 最近做一个小项目,对c++又 ...

  2. robotframework_如何用Chrome模拟手机打开H5页面

    由于公司目前的产品大部分都是APP端的H5页面,APP原生页面很少,测试H5页面如果去搭建appium或者macaca这类自动化平台太费时,太重而不能快速落地:与自动化的目标:提高测试效率相悖.但如果 ...

  3. BZOJ1856:[SCOI2010]字符串(卡特兰数,组合数学)

    Description lxhgww最近接到了一个生成字符串的任务,任务需要他把n个1和m个0组成字符串,但是任务还要求在组成的字符串中,在任意的前k个字符中,1的个数不能少于0的个数.现在lxhgw ...

  4. gluon 实现线性回归

    from mxnet import autograd, nd num_inputs = 2 num_examples = 1000 true_w = [2,-3.4] true_b = 4.2 fea ...

  5. Uva 10765 鸽子和炸弹

    题目链接:https://vjudge.net/contest/166461#problem/B 题意: 给一个无向图,求每一个点删除后,剩下的连通块的数目: 分析: 只有割顶被删掉后,连通分量才会改 ...

  6. Fiddler拦截并动态修改网页内容简易教程

    Fiddler默认可以拦截全局http请求,再加上它具备的脚本功能,可以很简单的达到动态修改网页内容的目的. 1.启动Fiddler 2.打开Rules->Customize Rules..., ...

  7. 【luogu P2071 座位安排】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2071#sub 邻接表 + 匈牙利 把之前的邻接矩阵匈牙利变成邻接表 要不然存不下... code: #inc ...

  8. HDU 1045 Fire Net(dfs,跟8皇后问题很相似)

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1045 Fire Net Time Limit: 2000/1000 MS (Java/Others)   ...

  9. 12java基础继承

    26.定义类Human,具有若干属性和功能:定义其子类Man.Woman: 在主类Test中分别创建子类.父类和上转型对象,并测试其特性.   package com.hry.test; public ...

  10. box-shadow的应用技巧

    一.box-shadow的参数解析 box-shadow:none; box-shadow: h-shadow v-shadow blur spread color inset; box-shadow ...