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

Identity:自增长

None:不处理

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

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

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

 public class Person
{
[Key]
public Guid SocialSecurityNumber { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
            var person = new Person
{
FirstName = "Rowan",
LastName = "Miller",
};
using (var context = new BreakAwayContext())
{
context.People.Add(person);
context.SaveChanges();
}

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

 public class Person
{
[Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid SocialSecurityNumber { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}

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

public class Person
{
[Key]
public int SocialSecurityNumber { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}

我们再插入一条记录看看

   var person = new Person
{
FirstName = "Rowan",
LastName = "Miller",
SocialSecurityNumber = 12345678
}; using (var context = new BreakAwayContext())
{
context.People.Add(person);
context.SaveChanges();
}

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

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

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

 public class Person
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
public int SocialSecurityNumber { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}

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

  public class Person
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
public int SocialSecurityNumber { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public string Name { get; set; }
}
var person = new Person
{
FirstName = "Rowan",
LastName = "Miller",
SocialSecurityNumber = 1231478,
Name = "Rowan Miller",
}; using (var context = new BreakAwayContext())
{
context.People.Add(person);
context.SaveChanges();
}

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

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

最新文章

  1. 《Linux内核设计与实现》读书笔记 第四章 进程调度
  2. SVN在eclipse的整合应用
  3. 配置 vim
  4. 【原创】初识懒人开发库---ButterKnife
  5. location.href参数丢失
  6. php-fpm 启动参数及重要配置详解
  7. Todd's Matlab讲义第4讲:控制误差和条件语句
  8. ehcache的介绍和使用
  9. Exceptionless 本地部署
  10. 神奇的 echo 命令
  11. HGE引擎之hgeSprite
  12. ABAP锁、数据库锁
  13. 1. VS2010---简介
  14. oc中的block
  15. R 语言DataFrame 排序
  16. javascript使用正则表达式验证Email地址
  17. poj2533--Longest Ordered Subsequence(dp:最长上升子序列)
  18. psql命令
  19. nginx的一些配置
  20. shell 分割字符串存至数组

热门文章

  1. 每日一记:搭建Memcached + php 缓存系统
  2. 利用PHPRPC以及SOAP分别实现PHP的Webserver功能
  3. UI事件监听的击穿
  4. schtasks命令遇见ERROR: The request is not supported.
  5. 安装ADT Cannot complete the install because one or more required items could not be found.
  6. win8.1下使用vmware workstation 来编译ffmpeg
  7. 【调侃】IOC前世今生 工厂模式 反射 依赖倒置
  8. Windows8、Windows8.1和Microsoft Office 2013激活
  9. SGU 130
  10. POJ1159——Palindrome(最长公共子序列+滚动数组)