我想将时间戳应用于我的Entity Framework项目。我有一个下面列出的课程。我希望这个课程能抓住当前的DateTime。但它提供了一个输入我的日期时间的字段。我希望这能抓住当前的日期时间。
public class Answer
{
public int ID { get; set; }
public string Answers {get; set;}
public System.DateTime DateCreated { get; set; }
public string Division { get; set; }
public string Phone { get; set; }
public string Description { get; set; }
}
下面是我知道错误的代码行。
public System.DateTime DateCreated { get; set; }
我有点不确定如何解决这个问题。我是实体的新手,也是MVC的新手。任何帮助将不胜感激。
答案 0 :(得分:3)
您可以在构造函数中初始化它,例如
public class Answer
{
public Answer()
{
DateCreated = DateTime.UtcNow;
}
...
}
但是,我的印象是您的Answer
类实际上不是实体而是视图模型。对于实际实体,我倾向于使用这样的固定/生成值让数据库使用默认值填充该字段,例如GetUtcDate()
然后在EF设计人员中将StoreGeneratedPattern
属性设置为Computed
- 这样,当您下拉实体时,CreatedDate
将被预先填充。这样既可以提供数据完整性,也可以在重新推送数据时覆盖数据库中的字段。
然后,只是将您的Answer
实体映射到Answer
视图模型,因此无需初始化任何内容。
答案 1 :(得分:1)
您可以在构造函数中设置DateCreated -
public Answer()
{
DateCreated = DateTime.Now;
}
然后,如果您在MVC视图中使用它,请将该字段设置为隐藏,以便不会更改。
答案 2 :(得分:1)
您可以通过覆盖上下文中的SaveChanges()方法来处理时间戳以及可能的修改日期。
下面的简单示例。
public abstract class BaseEntity
{
public int ID { get; set; }
public DateTime ModifiedDate { get; set; }
public DateTime CreatedDate { get; set; }
}
public class Answer : BaseEntity
{
public String Answers { get; set; }
public String Division { get; set; }
public String Phone { get; set; }
public String Description { get; set; }
}
public class DB_Context : DbContext
{
.....
public override int SaveChanges()
{
var changeSet = ChangeTracker.Entries<BaseEntity>();
if (changeSet != null)
{
foreach (var added in changeSet.Where(x => x.State == System.Data.EntityState.Added))
{
added.Entity.CreatedDate = DateTime.UtcNow;
added.Entity.ModifiedDate = DateTime.UtcNow;
}
foreach (var modified in changeSet.Where(x => x.State == System.Data.EntityState.Modified))
{
modified.Entity.ModifiedDate = DateTime.UtcNow;
}
}
return base.SaveChanges();
}
}