【问题标题】:Should i take DateTime.Now from Database?我应该从数据库中获取 DateTime.Now 吗?
【发布时间】:2015-08-27 13:50:32
【问题描述】:

我有一个 Windows 窗体应用程序,我的业务规则之一是当我停用客户时,使用当前日期和时间定义 DeactivationDateTime。

我正在使用实体框架和领域驱动设计。

我应该从数据库中获取日期时间还是在本地机器上强制使用正确的日期和时间?

public void DeactivateCustomer(int customerId, int userId)
{
        Check.ValidId(customerId);
        Check.ValidId(userId);

        var u = userRepository.GetById(userId);
        if (u == null)
            throw new EntityNotFoundException(userId);

        var c = customerRepository.GetById(id);
        if (c == null)
            throw new EntityNotFoundException(id);

        c.DeactivateData = new DeactivateData(userId, dateTimeProvider.Now);
        customerRepository.SaveOrUpdate(c);
}

dateTimeProvider 是一个 Infrastructure 接口,由构造函数注入。

【问题讨论】:

  • 此属性是否映射到您的用户实体?
  • 与您的问题无关,但是,我会将Check.ValidId(id) 更改为具体的UserId 和CustomerId VO 或统一的EntityId VO。此外,DeactivatedData 在我看来是一个奇怪的建模概念。为什么不使用 user.activationStatus = new InactiveStatus(date) 甚至 user.status = new InactiveStatus(date) 之类的东西。当User/Customer 的DeactivateData 时,你真的会有一个商业专家说......

标签: c# entity-framework domain-driven-design


【解决方案1】:

如果它映射到您的对象中的实体对我来说更自然的是从您的业务层中的应用程序代码中获取用户机器的日期。如果不是,如果我是一名正在处理此代码的新开发人员,我将很难发现 DeactivationDateTime 的填充位置。我假设您可以相信您的用户不会更改您的日期时间。

如果您有用户记得以 UTC 格式或时区信息保存 DateTime。

【讨论】:

  • 太棒了,我同意你的观点,Marc,但这将是对数据库的新调用,这让我感到不舒服。
  • 为什么要重新调用数据库?您可以在将用户设置为停用客户的同时执行此操作,还是在单独的表中停用列用户和停用日期时间?
  • DeactivatedUserId 和 DeactivatedDateTime 在同一个表中。我正在使用存储库模式。我有一个具有 DeactivatedUserId 和 DeactivatedDateTime 的复杂类型。
  • 如果我理解你的模型,同时更改这两个属性只需要一次调用数据库,使用 DBContext SaveChanges,实体框架在同一个更新语句中将更新你的两列数据库。
  • 查看您的代码,我认为这两列将仅通过一个数据库调用进行更新。如果只需一次调用就可以使用 Sql Server Profiler 检查它
猜你喜欢
  • 1970-01-01
  • 2020-11-07
  • 1970-01-01
  • 2022-11-19
  • 1970-01-01
  • 2021-11-25
  • 2010-10-30
  • 2021-11-07
  • 1970-01-01
相关资源
最近更新 更多