使用EF 4.1如何向基础表添加默认值?在这种特殊情况下,如何在每次向数据库插入新记录时将datetime列设置为等效的getdate,而不必在代码中设置它。
提前致谢
答案 0 :(得分:7)
@elkdanger提出的解决方案是可行的,但只要您使用代码优先方法,您就不必创建分部类 - 您可以将初始化直接放置到您的实体。
不要使用数据库方法!它不起作用,因为它会要求标记属性作为数据库生成(插入后正确重新填充)。标记属性数据库后,您永远不能在应用程序中更改其值。
最后一个选项会覆盖派生SaveChanges
中的DbContext
并手动设置属性。类似的东西:
public override int SaveChanges()
{
var entities = ChangeTracker.Entries<YourEntityType>()
.Where(e => e.State == EntityState.Added)
.Select(e => e.Entity);
var currentDate = DateTime.Now;
foreach(var entity in entities)
{
entity.Date = currentDate;
}
return base.SaveChanges();
}
如果在创建实体实例和保存实例之间存在显着差异,这种方法会更好。
答案 1 :(得分:2)
您可以为实体创建一个分部类,并在构造函数中将date列设置为DateTime.Now。这样,每次创建类的实例时,该字段都将“自动”设置为当前日期。
答案 2 :(得分:0)
您可以(也许应该)使用触发器或默认值在表中自行完成。
答案 3 :(得分:0)
实体框架本身没有它的机制。您必须在数据库或代码中手动执行此操作。
答案 4 :(得分:0)
您还可以修改T4模板(.tt文件)以添加从生成的构造函数中调用的部分方法。然后,您可以创建自己的分部类并实现部分方法并设置默认值。
创建构造函数的T4模板的片段,后跟partial方法。请注意最后三行:
public <#=code.Escape(entity)#>()
{
<#
foreach (var edmProperty in propertiesWithDefaultValues)
{
#>
this.<#=code.Escape(edmProperty)#> = =code.CreateLiteral(edmProperty.DefaultValue)#>;
<#
}
foreach (var navigationProperty in collectionNavigationProperties)
{
#>
this.<#=code.Escape(navigationProperty)#> = new HashSet<<#=code.Escape(navigationProperty.ToEndMember.GetEntityType())#>>();
<#
}
foreach (var complexProperty in complexProperties)
{
#>
this.<#=code.Escape(complexProperty)#> = new <#=code.Escape(complexProperty.TypeUsage)#>();
<#
}
#>
SetDefaultValues();
}
partial void SetDefaultValues();
这将导致生成的实体具有以下内容:
public Foo()
{
// Properties set based on defaults in edmx
SetDefaultValues();
}
partial void SetDefaultValues();
然后,在您的部分课程中,您只需添加以下内容:
partial void SetDefaultValues()
{
this.SomeDate = DateTime.Today;
}
答案 5 :(得分:0)
使用[DatabaseGenerated(DatabaseGeneratedOption.Computed)] 来自System.ComponentModel.DataAnnotations.Schema;
如果您在数据库上配置了默认值。