我为文章创建了一个模型,在文章中我试图实现在初始创建时创建的日期。
//模型
[Display(Name = "Date Created")]
public DateTime dateCreated
{
get { return DateTime.Now; }
}
我在创建文章时效果很好,但它也为所有其他文章设置了相同的日期时间值。 :/
有解决方法吗?
欢呼声。
答案 0 :(得分:5)
将它放在属性中将在每次访问属性时评估DateTime.Now
,因此如果您查询它两次,您将获得两个不同的值。
有许多可能的选项可用于对此进行建模,但通常您需要在构造函数中设置只读属性:
public Article()
{
This.DateCreated = DateTime.Now;
}
[Display(Name = "Date Created")]
public DateTime DateCreated {get; private set;}
答案 1 :(得分:2)
我在创建文章时效果很好,但它也设置了相同的日期 所有其他文章的时间价值。
这正是一个坏主意的原因。得到你所做的就是用这个属性公开当前的日期和时间。
为什么在保存更改之前无法正确设置?
例如:
public override int SaveChanges()
{
DateTime saveTime = DateTime.Now;
foreach (var entry in this.ChangeTracker.Entries().Where(e => e.State == System.Data.EntityState.Added))
{
if (entry.Property("dateCreated").CurrentValue == null)
entry.Property("dateCreated").CurrentValue = saveTime;
}
return base.SaveChanges();
}
答案 2 :(得分:2)
以下是您的需求:
private DateTime? dateCreated;
public DateTime DateCreated
{
get { return dateCreated ?? DateTime.Now; }
set { dateCreated = value; }
}
这样做是等到首次访问此属性。然后,它将查看是否已设置创建日期,如果没有,则将其设置为DateTime.Now
。对于初始创建,这通常会在EF尝试将其保存到数据库时发生,这正是您希望发生的时间。如果您在保存之前尝试手动访问该属性,则只会更快发生,但没有充分的理由说明您为什么这样做。 set方法只允许一个普通的set,所以当EF从数据库中提取它时,它只会设置私有字段,它将始终设置为。