实体框架:StoreGeneratedPattern =“Computed”属性

时间:2011-02-18 14:15:33

标签: c# sql-server-2005 entity-framework ado.net-entity-data-model

我有一个DateTime属性。我需要此属性的默认值为DateTime.Now。然后我发现您可以指定一个属性StoreGeneratedPattern="Computed"并在SQL中将其设置为(getdate())。这成功了。但我无法在代码中更改此属性。有时我需要将此属性更改为任何DateTime值。但是我的更改没有保存。

1 个答案:

答案 0 :(得分:14)

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