【问题标题】:Entity framework: StoreGeneratedPattern="Computed" property实体框架:StoreGeneratedPattern="Computed" 属性
【发布时间】:2011-06-29 20:44:36
【问题描述】:
我有一个DateTime 属性。我需要此属性的默认值为DateTime.Now。然后我发现你可以在SQL中指定一个属性StoreGeneratedPattern="Computed"并设置为(getdate())。这成功了。但我无法在代码中更改此属性。有时我需要将此属性更改为任何 DateTime 值。但我的更改没有保存。
【问题讨论】:
标签:
c#
sql-server-2005
entity-framework
ado.net-entity-data-model
【解决方案1】:
将此属性设置为 Computed 是告诉 EF 您不能直接设置该值。你怎么能?该属性的存在是为了计算列,根据定义,计算列不会保存回数据库。
不幸的是,EF 的“默认值”属性只能设置为编译时已知的值,因此不能设置为 DateTime.Now
此链接提供了一个不错的解决方法:
Setting the default value of a DateTime Property to DateTime.Now inside the System.ComponentModel Default Value Attrbute
您还可以在上下文中处理 SavingChanges 事件,并在其中添加默认值,但这仅在您实际调用 SaveChanges() 时发生,而不是在创建对象时发生。
partial void OnContextCreated() {
this.SavingChanges += new EventHandler(AccrualTrackingEntities_SavingChanges);
}
void AccrualTrackingEntities_SavingChanges(object sender, EventArgs e) {
List<Invoice> Invoices = this.ObjectStateManager
.GetObjectStateEntries(System.Data.EntityState.Added | System.Data.EntityState.Modified)
.Select(entry => entry.Entity)
.OfType<Invoice>().ToList();
foreach(Invoice I in Invoices)
if (I.EntityState == System.Data.EntityState.Added) {
//set default values
} else {
//?? whatever
}
}