12

我有DateTime属性。我需要此属性的默认值为DateTime.Now。然后我发现你可以在SQL中指定一个属性StoreGeneratedPattern="Computed"并将其设置为(getdate())。这工作成功。但我无法在代码中更改此属性。有时我需要将此属性更改为任何DateTime值。但我的更改没有保存。实体框架:StoreGeneratedPattern =“计算”属性

回答

14

将此属性设置为Computed会告诉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 
      } 
    }