【问题标题】:How to set datetime field value to now [closed]如何将日期时间字段值设置为现在 [关闭]
【发布时间】:2012-09-28 11:26:54
【问题描述】:

我有带有日期时间字段的模型。

我的代码正在使用模型设置此重置此字段到现在。 但是我现在不想“设置”,而是现在“保存”:即如果我设置field1 = now [0:00:00],那么,10s。稍后field2 = now [0:00:10] 然后,10 秒。稍后,我执行 SaveChanges() 我想将两个字段都设置为 0:00:20(节省时间)。

编辑:代码示例:

var context = new SomeEntities();
SomeModel model = context.GetSomeModel(...);
// SomeModel has two DateTime fields: dt1 and dt2
model.dt1 = SavingDateTimeNow(); // .... 13:42:00
// some code, i.e. Sleep(TimeSpan.FromSeconds(10));
model.dt2 = SavingDateTimeNow(); // .... 13:42:10
// again 10s. code
context.SaveChanges(); // .... 13:42:20

Edit2:更复杂的例子:

var context = new SomeEntities();
SomeModel model = context.GetSomeModel(...);
// SomeModel has two DateTime fields: dt1 and dt2
if(someComplexCondition)model.dt1 = SavingDateTimeNow(); // .... 13:42:00
// some code from which I would know if someOtherComplexCondition is true
if(someOtherComplexCondition)model.dt2 = SavingDateTimeNow(); // .... 13:42:10
// again 10s. code
// much more code here
context.SaveChanges(); // .... 13:42:20

我希望(dt1 和 dt2)都设置为 ... 13:42:20,而不是 13:42:00 和 13:42:10

Edit3:最简单的例子:我希望它可以像 django 的字段一样使用auto_now=True

【问题讨论】:

  • 您可以使用数据库通过使用 GetDate() 的默认值来填充这些值
  • 最简单的方法是在调用 SaveChanges 之前设置 DateTime 字段或查看 tomasmcguinness 评论
  • @tomasmcguinness 我不知道该怎么做。如何从 c# 和 EF 将此字段设置为 GetDate()
  • @Scoregraphic 这很难:有复杂的代码有时会设置一些字段。在保存之前我不能轻易做到。
  • 在您的数据库表中,您需要设置默认值。这应该为您指明正确的方向。 msdn.microsoft.com/en-us/library/ms187872.aspx

标签: c# sql-server database visual-studio entity-framework


【解决方案1】:

这不是一个完整的答案,而是需要考虑的一些提示。

  1. 您可以将dt1dt2StoreGeneratedPattern 属性设置为Computed,并在数据库级别处理这种情况。
  2. 您可以在数据库级别将默认值设置为getdate(),对于未指定dt 的新记录,它将设置为现在。

【讨论】:

    【解决方案2】:

    啊,所以可能有多个模型已被修改,并且可能需要在保存时设置 DateTime。

    在这种情况下,要么将布尔标志(setDt1 和 SetDt2)推送到模型中,然后在您进行更改时将这些模型添加到列表中...或者将 <model,bool,bool> 的元组添加到列表中。

    查看这个问题Getting all changes made to an object in the Entity Framework 以查看然后循环遍历这些存储模型以查看其修改后的属性的示例。

    您可以查看实体的EntityState以获取已添加的实体

    var addedStateEntries = Context.ObjectStateManager.GetObjectStateEntries(EntityState.Added);
    

    以及已用

    修改的实体
    var modifiedStateEntries = Context.ObjectStateManager.GetObjectStateEntries(EntityState.Modified);
    

    当你准备好保存和设置 dt1 或 dt2 时,你可以循环它们


    如果我理解正确,那么当您 saveChanges() 时,您希望 dt1 和 dt2 设置为 DateTime.Now

    在这种情况下,将您对 context.SaveChanges() 的调用替换为对以下方法的调用

    private void SaveModel(SomeEntities context, SomeModel model bool setDt1, bool setDt2) {
      DateTime instant = DateTime.Now;
      if (SetDt1) { model.dt1 = instant; }
      if (setDt2) { model.dt2 = instant; }
      context.SaveChanges();
    }
    

    所以看看更复杂的例子......一旦我知道是否应该在保存时设置日期,我就会设置一个标志。我已将SavingDateTimeNow() 留在原处,因为我不知道它是否执行其他任务以及将 dt1 设置为 Now

    var context = new SomeEntities();
    SomeModel model = context.GetSomeModel(...);
    var setDt1 = false;
    var setDt2 = false;
    
    // SomeModel has two DateTime fields: dt1 and dt2
    if(someComplexCondition) {
     model.dt1 = SavingDateTimeNow(); // .... 13:42:00
     setDt1 = true;
    }
    // some code from which I would know if someOtherComplexCondition is true
    if(someOtherComplexCondition) {
      model.dt2 = SavingDateTimeNow(); // .... 13:42:10
      setDt2 = true;
    }
    // again 10s. code
    // much more code here
    SaveModel(context, model, setDt1, setDt2); // .... 13:42:20
    

    【讨论】:

    • @paul-dambra 我添加了更复杂的示例。没那么容易。
    • @Paul,我编辑了您的答案以包括 OP 想要的(我认为)。如果我不正确,请随时回滚。
    • @BradRem 我作为编辑同时抱歉
    • 再一次,整个代码要复杂得多,所以我不能使用任何解决方案,最后检查是否需要将某个日期设置为现在或否。
    • 那么我认为您需要编辑您的问题以更清楚地说明问题。您想在保存模型时有条件地将模型的字段设置为 DateTime.Now 吗?好的,那么还有什么比设置一个布尔标志并在保存时检查它更复杂的呢?
    【解决方案3】:

    为什么不扩展您的对象模型以包含 SaveDateTime 属性。然后你使用:

    dt1.SaveDateTime = true;
    

    当您调用 SaveChanges() 时,您会将所有正面标志更新为当前 DateTime(记得在之后重置)。

    【讨论】:

    • 我不知道任何 OnSave 事件。当我调用 SaveChanges 时,我知道我的逻辑发生了什么变化。所以我不能只检查更多的字段。它必须在实体或模型中的某个地方,但我仍然不知道如何编写它。
    【解决方案4】:

    我找到了不完美的解决方案(如果您找到更好的解决方案,请在此处发布)。 这里是全文:Dave Dunkin's blog: Automatic Timestamping for Entity Framework

    这个想法是:

    1. 为需要此功能的模型创建接口
    2. 实现接口
    3. 在 Entity 中创建方法,该方法将遍历所有修改的实体,检查实现接口的实体并修改其日期时间字段(可以通过此接口中的方法完成)
    4. 将此方法添加到实体中的 SavingChanges 事件

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-19
      相关资源
      最近更新 更多