EF6中,如果将模型类的ID属性设置为主键自增,则我们在外部怎么对其赋值,数据库依然会将该值自增,而不会处理外部给的值。
如果我们在新增数据之后,需要用到这个自增的ID主键,怎么获取呢?EF6在执行完context.SaveChanges()之后,会自动将这个自增ID主键值从数据库中返回并赋给当前ID属性。其实我们什么都不用操作,直接获取。如下代码:
using (DemoContext context = new DemoContext()) { //在使用模型类之前需要强制创建数据库 true:强制创建 context.Database.Initialize(true); #region 新增 Student stu = new Student { Name = "赵子成", BirthDay = DateTime.Parse("1990-08-01"), Age = 27 }; //新增一个Student实体,相当于在Student表中,新增一条数据 context.Students.Add(stu); Console.WriteLine("新增之前\nID={0} Name={1} BirthDay={2} Age={3} \n", stu.ID, stu.Name, stu.BirthDay.Value.ToString("yyyy/MM/dd"), stu.Age); //保存 context.SaveChanges(); Console.WriteLine("新增之后\nID={0} Name={1} BirthDay={2} Age={3}", stu.ID, stu.Name, stu.BirthDay.Value.ToString("yyyy/MM/dd"), stu.Age); #endregion }
新增过后的结果:
新增之前 ID=00000000-0000-0000-0000-000000000000 Name=赵子成 BirthDay=1990/08/01 Age=27 新增之后 ID=c4049f86-3d74-e711-970d-58fb84575557 Name=赵子成 BirthDay=1990/08/01 Age=27
ID就是Student模型类的自增主键。新增之后可以直接获取该ID值。
不过有一个算是惯例优先模式的一个小坑。如果我们给某个模型类定义了一个ID属性,如下代码:
public class Course{ public int ID{get;set;} public string Name{get;set;} }
在使用EF的时候,EF会将ID当做自增主键去处理。但是这时我们不希望ID是自增主键,只是把它当做一个普通的属性而已。这时要给其增加一个约束特性[DatabaseGenerated(DatabaseGeneratedOption.None)]。代码如下:
public class Course{ [DatabaseGenerated(DatabaseGeneratedOption.None)] public int ID{get;set;} public string Name{get;set;} }