有两个数据类型为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
答案 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; }
}
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代理,处理它。
同样,即使有一个空的界面,最好有一个可以清楚地区分可审计记录和常规记录。
如果可能强制所有人具有相同的属性名称和类型,请执行此操作。