我正在进行代码优先项目,并且我需要数据库来处理DateCreated
和DateModified
。
该应用程序在IIS Express上运行,并且具有开发机上的LocalDB,并将在带有IIS 7.5的部署服务器上使用SQL Server 2012。
我有以下模型:
public class Person : IdentityUser {
[Required]
public string Name { get; set; }
public Date DateOfBirth { get; set; }
public string Address { get; set; }
[DatabaseGeneratedOption.Identity]
public Date DateCreated { get; set; }
[DatabaseGeneratedOption.Identity]
public Date DateModified { get; set; }
}
请列出配置数据库以处理事务元数据的确切步骤,例如需要在模型中设置的内容以及在数据库上下文配置器中是否要执行的任何操作。我正在搜索类似的内容:“您需要了解的有关ASP.NET MVC日期处理的所有信息”,但是在这方面没有太多帮助。
提前致谢。
最佳答案
我将从实体框架的角度考虑这一点。
您基本上需要执行以下操作:
1-我将定义一个类似于ITrackable接口的接口,并让我的模型实现该接口(如果这些模型需要跟踪DateCreated和DateModified属性)。
2-您的模型以某种方式知道它是否是添加/修改的实体,因为这将决定要设置的属性(“添加的实体”和“修改的实体都为DateModified”)。
3-在实体框架中使用DbContext添加尝试通过SaveChanges或SaveChangesAsync保存实体时需要调用的扩展方法,该方法将循环遍历被跟踪的实体,并根据实体的状态设置DateCreated和DateModified属性。
因此,您的模型将如下所示:
public class Person : IdentityUser, ITrackable
{
[Required]
public string Name { get; set; }
public Date DateOfBirth { get; set; }
public string Address { get; set; }
public DateTime DateCreated { get; set; }
public DateTime DateModified { get; set; }
}
ITrackable的外观
public interface ITrackable
{
public DateTime DateCreated { get; set; }
public DateTime DateModified { get; set; }
}
扩展方法将如下所示:
internal static class ContextHelper
{
internal static void SyncObjectsStatePreCommit(this DbContext dbContext)
{
foreach (var dbEntityEntry in dbContext.ChangeTracker.Entries())
{
// do any other stuff you want.
// ..
// ..
// work with ITrackable entities
var trackableObject = dbEntityEntry.Entity as ITrackable;
// we need to set/update trackable properties
if (trackableObject == null)
{
continue;
}
var dateTime = DateTime.Now;
// set createddate only for added entities
if (entityState.ObjectState == ObjectState.Added)
{
trackableObject.CreatedDate = dateTime;
}
// set LastUpdatedDate for any case other than Unchanged
if (entityState.ObjectState != ObjectState.Unchanged)
{
trackableObject.ModifiedDate = dateTime;
}
}
}
}
现在,例如,在dbContext Save方法中,您需要调用此方法来设置所有这些属性。
public override Task<int> SaveChangesAsync()
{
this.SyncObjectsStatePreCommit();
return base.SaveChangesAsync();
}
希望能有所帮助。