【问题标题】:How to implement a DateTime entity property to set always DateTime.Now如何实现 DateTime 实体属性以始终设置 DateTime.Now
【发布时间】:2013-12-14 04:58:29
【问题描述】:

我读过很多关于自动实现属性的文章,但我还是不太明白。我有和实体:

 public class News
    {
        public int NewsId { get; set; }
        public string Title { get; set; }
        public string Content { get; set; }
        public DateTime Date { get; set; }
    }

现在我不希望用户每次创建News 类型的新实体时都自己设置日期。我希望记录与创建的日期时间一起自动保存。考虑一下,我建议只需将我的属性的 set 修改为以下内容就足够了:

public DateTime Date 
{
  get;
  set
  {
    Date = DateTime.Now;
  }
}

但是在阅读该主题时,我看到标准方法是创建私有变量并在实现中使用它。这就是我有点失落的地方。

private DateTime _date = null;
public DateTime Date
{ 

好吧,我不确定 getter 和 setter 的实现。有类似的东西似乎是合理的:set { _date = DateTime.Now;} 我不知道如何处理get 部分,因为我希望从数据库中获取这些数据,所以类似:get {return _date;} doesn't make much sense to me even though almost every example with auto implementedset` 返回私有变量。但我认为如果属性是一个实体,这没有多大意义。

【问题讨论】:

    标签: c# entity-framework datetime properties


    【解决方案1】:

    返回当前日期的一些方法:

     public DateTime Date { get { return DateTime.Now; } }
    

     public class News
     {
        public News()
        {
           Date = DateTime.Now;
        }
        public DateTime Date { get; private set; }
     }
    

    第一个将始终返回当前日期/时间,即使该实例是前一段时间创建的。第二个将返回创建实例的日期/时间。两者都阻止用户设置该日期值。

    【讨论】:

    • 由于它是实体的属性,我需要能够显示创建时间(从名称可以看出,它是一个News 表)。因此,当我得到日期时,我需要数据库日期,但是当我设置日期时,这意味着我创建了新的实体/新闻,我想设置实体创建的日期。所以我猜第二种方法?
    • @Leron - 如果某些代码可以设置日期(从数据库中检索)而其他代码不能(“客户端”端代码),那就是个问题。您也许可以使用其他构造函数来设置日期,但是您必须自己编写数据库到实体的代码。
    • 我明白你的意思。如果我在查询记录时理解正确,则日期将始终被 DateTime.Now 覆盖。因此,在设置其他属性的代码中设置日期而不是寻找将逻辑移动到实体的方法更容易?
    • @Leron - 正确。您仍然可以在构造函数中为新的新站点提供默认值 (DateTime.Now)。
    【解决方案2】:

    您可以为您的类添加一个构造函数,然后在那里初始化您的属性。

    public class News
    {
    
       // properties goes here
    
       public News()
       {
           Date=DateTime.Now;
       }
    
    }
    

    更好的构造函数如下

    public News(int newsId, string title, string content)
    {
        NewsId=newsId;
        Title=title;
        Content=content;
        Date=DateTime.Now;
    }
    

    这样您就可以在一行代码中创建一个 News 类型的对象。

    News news = new News(1,"title1","whatever");
    

    【讨论】:

    • 嗨。我搜索过这个value 变量是什么,但我找不到关于它是如何创建和使用的解释。似乎我可以在实现自定义 getter/setter 时立即使用,但我真的不明白 Date = DateTime.Nowvalue = DateTime.Now; 之间的区别
    • @Leron 上下文关键字值用于普通属性声明中的 set 访问器。我以前用过假的。请看这里msdn.microsoft.com/en-us/library/vstudio/a1khb4f8.aspx
    • 但是你已经通过移动构造函数中的逻辑来改变它。是不是更好,还是因为我已经问过如何使用我的 Date 属性来做到这一点?
    • @Leron,我认为有两种方法可以做到这一点。第一个是上面的第二个是Hans建议的。这是您个人意见的问题,而不是在这种情况下更好的实施。
    • NewsId 是数据库中自动生成的属性。问题是如何在保存实体时自动设置属性,但是当我查询从表中获取日期时。
    【解决方案3】:

    不要碰 getter 和 setter!它们是从模板自动生成的,并且每隔一段时间就会被覆盖。相反,您可能已经注意到生成的实体是部分声明的,创建一个部分类并在其中声明一个构造函数,在构造时将您的实体的 _date 或 Date 设置为 DateTime.Now(就像您需要)。

    public partial class News
    {
      public News()
      {
        this.Date = DateTime.Now;
      }
    } 
    

    【讨论】:

    • 好吧,我不确定我是否理解你。我没有写这个,但它是Code First 工作流,所以所有实体都是我写的。我见过实体的部分类,但与自动生成实体的Database First 工作流一起使用。拥有自己的News 实体然后添加部分类只是为了添加构造函数有什么意义?
    • 啊,我明白了!但是你可以很容易地在你的构造函数中将日期设置为 DateTime.Now,就像其他人提到的那样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    相关资源
    最近更新 更多