2

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

我的代码正在使用模型设置此重置此字段到现在。但是我现在不想“设置”,而是现在“保存”:即如果我设置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

4

4 回答 4

0

啊,所以可能有多个模型已被修改,并且可能需要在保存时设置 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 时,您可以遍历它们


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

在这种情况下,将您的调用替换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
于 2012-09-28T11:48:54.470 回答
0

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

  1. 您可以在数据库级别设置和处理属性并处理这种StoreGeneratedPattern情况dt1dt2Computed
  2. 您可以将默认值设置为getdate()数据库级别,对于未指定的新记录,dt它将设置为现在。
于 2012-09-28T12:05:07.417 回答
0

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

dt1.SaveDateTime = true;

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

于 2012-09-28T12:26:16.767 回答
0

我找到了不完美的解决方案(如果您找到更好的解决方案,请在此处发布)。这是完整的文章:Dave Dunkin 的博客:实体框架的自动时间戳

这个想法是:

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