提纲:
- [DatabaseGenerated(DatabaseGeneratedOption.None)]
- [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
- [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
- 为字段指定默认值
- 为字段指定计算值
对于某些字段,服务器端可能会自动生成新值.
- 添加时产生新值
如果由数据库生成值,则当你将实体添加到上下文时,EF 可能会赋予一个临时值。 在 SaveChanges()期间,此临时值将替换为数据库生成的值。
如果将一个实体添加到已经为属性赋予值的上下文,则 EF 会尝试插入该值而不是生成新值。 如果某个属性未分配 CLR 默认值(null 用于 string,0 用于 int,Guid.Empty Guid等),则该属性被视为已分配值。
上面这句话指, 如果客户端指定了非 CLR 的默认值, 则 EF将尝试插入客户端指定的值
- 在添加或更新时生成值
在添加或更新时生成值,意味着在每次保存该记录(插入或更新)时生成新值。
与新增时一样,如果为新添加的实体实例的属性指定值,则将插入该值,而不是要生成的值。
还可以在更新时设置显式值。
设置默认值 ( 添加新记录时 )
指定数据库内新记录产生的默认值为 3
modelBuilder.Entity<Blog>().Property(b => b.Rating).HasDefaultValue(3);
指定数据库内新记录产生的默认值为 getdate
modelBuilder.Entity<Blog>().Property(b => b.Rating).HasDefaultValueSql("getdate()");
指定字段由服务器更新值
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
modelBuilder.Entity<Blog>().Property(b => b.LastUpdated).ValueGeneratedOnAddOrUpdate();
计算列
某些关系数据库上,列可以配置为在数据库中计算其值,通常具有引用其他列的表达式
modelBuilder.Entity<Person>().Property(p => p.DisplayName).HasComputedColumnSql("[LastName] + ', ' + [FirstName]");
以上由服务器产生的字段内容,在保存后,都将会将服务器产生的字段内容填充会 EF的实体中;
指定主键有客户端指定而不是由服务器端产生
'[DatabaseGenerated(DatabaseGeneratedOption.None)]'
'modelBuilder.Entity<Blog>().Property(b => b.BlogId).ValueGeneratedNever();`
网友评论