模型C中的DateTime.Now#ASP.NET MVC 4

时间:2014-03-03 20:41:22

标签: c# asp.net asp.net-mvc asp.net-mvc-4

我为文章创建了一个模型,在文章中我试图实现在初始创建时创建的日期。

//模型

    [Display(Name = "Date Created")]
    public DateTime dateCreated
    {
        get { return DateTime.Now; }
    }

我在创建文章时效果很好,但它也为所有其他文章设置了相同的日期时间值。 :/

有解决方法吗?

欢呼声。

3 个答案:

答案 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从数据库中提取它时,它只会设置私有字段,它将始终设置为。