我正在开发Code-First项目,我需要数据库来处理DateCreated
和DateModified
。
应用程序在开发机器上使用LocalDB的IIS Express上运行,并将在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; }
}
请详细说明配置DB以处理事务元日期的步骤,例如需要在模型中设置的内容以及是否在DB上下文配置器中执行任何操作。我正在寻找类似的东西:“所有你需要知道的关于ASP.NET MVC日期处理”,但是没有太多涉及这方面。
提前致谢。
答案 0 :(得分:3)
我将从实体框架的角度考虑这个问题。
您基本上需要执行以下操作:
1-我将定义一个类似ITrackable接口的接口,并使我的模型实现该接口,如果这些模型需要跟踪DateCreated和DateModified属性。
2-某种程度上,你的模型知道它是否是添加/修改实体,因为这将决定要设置的属性(添加实体和修改实体的DateModified)。
3-使用Entity-Framework中的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; }
}
,扩展方法将是这样的:
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方法中,您需要调用此方法来设置所有这些属性。
希望有所帮助。
答案 1 :(得分:0)
我发现上述答案有点混乱,但我认为更直接的解决方案是覆盖blog
中描述的SaveChanges
方法
此解决方案还使用ITrackable
接口,当SaveChanges
被触发时,它会检查Entity
是否实现此接口:
public override System.Threading.Tasks.Task<int> SaveChangesAsync()
{
foreach (var auditableEntity in ChangeTracker.Entries<ITrackableEntity>())
{
if (auditableEntity.State == EntityState.Added ||
auditableEntity.State == EntityState.Modified)
{
// implementation may change based on the useage scenario, this
// sample is for forma authentication.
string currentUser = HttpContext.Current.User.Identity.GetUserId();
DateTime currentDate = SiteHelper.GetCurrentDate();
// modify updated date and updated by column for
// adds of updates.
auditableEntity.Entity.ModifiedDateTime = currentDate;
auditableEntity.Entity.ModifiedUserId = currentUser;
// pupulate created date and created by columns for
// newly added record.
if (auditableEntity.State == EntityState.Added)
{
auditableEntity.Entity.CreatedDateTime = currentDate;
auditableEntity.Entity.CreatedUserId = currentUser;
}
else
{
// we also want to make sure that code is not inadvertly
// modifying created date and created by columns
auditableEntity.Property(p => p.CreatedDateTime).IsModified = false;
auditableEntity.Property(p => p.CreatedUserId).IsModified = false;
}
}
}
return base.SaveChangesAsync();
}