Ann*_*nie 4 c# asp.net-mvc datetime entity-framework asp.net-mvc-5
我正在开发一个代码优先项目,我需要数据库来处理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; }
}
Run Code Online (Sandbox Code Playgroud)
请列出配置数据库以处理事务元数据的确切步骤,例如需要在模型中设置的内容以及数据库上下文配置器中是否需要采取任何操作。我正在寻找类似的内容:“您需要了解的有关 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; }
}
Run Code Online (Sandbox Code Playgroud)
ITrackable 的样子
public interface ITrackable
{
public DateTime DateCreated { get; set; }
public DateTime DateModified { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
扩展方法将是这样的:
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;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
例如,现在在 dbContext Save 方法中,您需要调用此方法来设置所有这些属性。
public override Task<int> SaveChangesAsync()
{
this.SyncObjectsStatePreCommit();
return base.SaveChangesAsync();
}
Run Code Online (Sandbox Code Playgroud)
希望有帮助。