Should i take DateTime.Now from Database?
我有一个Windows窗体应用程序和我的业务规则之一是当我停用客户时,使用当前日期和时间定义DeactivationDateTime。
我正在使用实体框架和域驱动设计。
我应该从数据库中获取日期时间还是在本地计算机上强制使用正确的日期和时间?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| 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接口。
-
此属性是否映射到您的用户实体?
-
嗨马克。 是。"
-
Nothin与您的问题有关但是,我会使用具体的UserId和CustomerId VO或统一的EntityId VO更改Check.ValidId(id)。 此外,DeactivatedData对我来说看起来很奇怪。 为什么不像user.activationStatus = new InactiveStatus(date)甚至user.status = new InactiveStatus(date)。 你真的有一个商业专家说,当DeactivateData User/Customer ....
如果它在您的对象中映射的实体对我来说,从您的业务层中的应用代码中获取日期来自用户计算机更自然。 如果不是,如果我是一名新的开发人员,那么我将很难发现DeactivationDateTime的填充位置。 我假设您可以相信您的用户不会更改您的日期时间。
如果您有用户记得以UTC格式或TimeZone信息保存DateTime。
-
真棒,我同意你Marc,但那将是对数据库的新调用,这让我感到不舒服。
-
为什么要对数据库进行新的调用?您可以在将用户设置为已停用客户的同时执行此操作,还是在单独的表中将Deactivated column user和DeactivatedDateTime设置为?
-
同一个表中的DeactivatedUserId和DeactivatedDateTime。我正在使用Repository Pattern。我有一个具有DeactivatedUserId和DeactivatedDateTime的复杂类型。
-
如果我很了解你的模型同时更改这两个属性只需要一次调用数据库,使用DBContext SaveChanges,同一更新语句中的实体框架将更新数据库中的两列。
-
我添加了一些示例代码。
-
查看您的代码,我认为只需使用一个数据库调用即可更新这两列。如果仅通过一次调用完成,请使用Sql Server Profiler进行检查
-
dateTimeProvider在我的infraestructure层实现,从实体框架调用到数据库以获取GETDATE()
-
我以为你是从用户机器上检索的,为什么你需要从SqlServer中检索日期?你不能从用户机器获得?
-
用户可以将本地计算机日期时间更改为损坏状态。
-
我应该从数据库或FORCE在本地计算机上获取正确的日期和时间吗?
-
让我们在聊天中继续讨论。
-
考虑通过将最后一句更改为"如果您有用户记得以UTC格式保存DateTime"来删除"在不同时区"。绝对没有理由将日期时间值存储为本地值。
-
@AlexeiLevenkov即使您知道您的用户将始终位于同一时区,例如本地社区的应用程序。你是否建议以UTC格式保存?如果是,为什么?谢谢
-
@MarcCals是的,我坚信将UTC(或时间+偏移量作为完整的ISO8601格式)存储起来要容易得多。显然这是自以为是的建议(stackoverflow.com/questions/11537106/…)。如果您居住在经常调整夏令时规则或多个时区的国家(我主要是指"不在中国",只有一个时区),那么很难正确追踪"当地时间"的含义。