DbContext实体框架Datetime.Now字段

时间:2014-01-22 22:12:24

标签: c# .net entity-framework datetime t4

有两个数据类型为datetime的字段。

  • 添加
  • 修饰

为两个字段插入新记录值时,必须System.DateTime.Now; 但只更新Modified时需要更改。

我可以将StoreGeneratedPattern设置为Computed并在数据库中使用Modified处理GETDATE()字段,但问题是字段Added

我的猜测是我必须覆盖SavingChanges()或类似但不知道如何。

编辑:到目前为止我尝试了什么

  • 在我的项目中添加了另一个使用代码

    的类
    namespace Winpro
    {
        public partial class Customer
        {
            public Customer()
            {
                this.Added = DateTime.UtcNow;
            }
        }
    }
    

    然后无法构建解决方案

    Type 'Winpro.Customer' already defines a member called 'Customer' with the same parameter types

2 个答案:

答案 0 :(得分:1)

一个选项是为设置字段的类型定义构造函数。

重要提示:除非您确切知道自己在做什么,否则请始终以UTC格式在数据库中存储日期和时间。 DateTime.Now是计算机的本地时间,可以根据夏令时,时区变化(由政治/立法原因引起)而变化,并且可能最终使日期信息无效。使用DateTime.UtcNow

public partial class MyEntity {
    public MyEntity() {
        this.Added = DateTime.UtcNow;
    }
}

答案 1 :(得分:1)

我们过去做过一些非常相似的事情。

需要存储日期和时间以及负责创建记录。此外,在每次更改时,如果有审计记录,则进行调度,基本记录还应获得日期和时间以及负责更改的用户。

以下是我们所做的:

接口

为了添加一些标准行为并使事物更具可扩展性,我们创建了两个接口,如下所示:

public interface IAuditCreated
{
   DateTime CreatedDateTime { get; set; }
   string CreationUser { get; set; }
}

public interface IAuditChanged
{
   DateTime LastChangeDateTime { get; set; }
   string LastChangeUser { get; set; }
}

覆盖SaveChanges()以添加一些自动控制

public class WhateverContext : DbContext
{
   // Some behavior and all...

   public override int SaveChanges()
   {
      // Added ones...
      var _entitiesAdded = ChangeTracker.Entries()
         .Where(_e => _e.State == EntityState.Added)
         .Where(_e => _e.Entity.GetType().GetInterfaces().Any(_i => _i == typeof(IAuditCreated)))
         .Select(_e => _e.Entity);
      foreach(var _entity in _entitiesAdded) { /* Set date and user */ }

      // Changed ones...
      var _entitiesChanged = ChangeTracker.Entries()
         .Where(_e => _e.State == EntityState.Modified)
         .Where(_e => _e.Entity.GetType().GetInterfaces().Any(_i => _i == typeof(IAuditChanged)))
         .Select(_e => _e.Entity);
      foreach(var _entity in _entitiesChanged) { /* Set date and user */ }

      // Save...
      return base.SaveChanges();
   }
}

不要简单地复制和粘贴!

此代码是几年前在EntityFramework v4时代编写的。它假设您已经检测到更改(ChangeTracker可用)和其他一些更改。

此外,我们完全不知道此代码如何以任何方式影响性能。这是因为这个系统的使用与查看相关或者与更新有关,也因为它是桌面应用程序,所以我们有足够的可用内存和处理时间来浪费。

应该考虑到这一点,您可能会找到更好的方法来实现它。但整个想法是一样的:过滤哪些实体正在更新,哪些实体正在被添加以正确处理。

另一种方法

有很多方法可以解决这个问题。另一个可能在某些情况下(但也更复杂)更好的性能是使用某种代理,类似于EF代理,处理它。

同样,即使有一个空的界面,最好有一个可以清楚地区分可审计记录和常规记录。

如果可能强制所有人具有相同的属性名称和类型,请执行此操作。