在Julie Lerman关于实体框架的优秀书中,她展示了一个简单的函数,可以自动更改实体的ModifiedDate列,如果碰巧有一个。我在下面添加了
Friend Sub FixUpModifiedDates()
Dim entries = From ose In Me.ObjectStateManager.GetObjectStateEntries(EntityState.Added Or EntityState.Modified) Where ose.Entity IsNot Nothing
For Each entry In entries
Dim fieldMetaData = entry.CurrentValues.DataRecordInfo.FieldMetadata
Dim modifiedField As FieldMetadata = fieldMetaData.Where(Function(f) f.FieldType.Name = "ModifiedDate").FirstOrDefault()
If modifiedField.FieldType IsNot Nothing Then
Dim fieldTypeName As String = modifiedField.FieldType.TypeUsage.EdmType.Name
If fieldTypeName = PrimitiveTypeKind.DateTime.ToString() Then
entry.CurrentValues.SetDateTime(modifiedField.Ordinal, DateTime.Now)
End If
End If
Next
End Sub
我正在将使用它的遗留模型转换为EF6.x和dbContext。这个代码失败了,其中一个原因是它需要一个Imports System.Data.Entity,它原来没有。然而,对ObjectStateManager的引用是纯粹的ObjectContext,我在将其转换为DbContext友好代码时遇到了麻烦(尤其是因为似乎有越来越少的参考文章或书籍(包括Julie自己关于这个主题的书)用其他任何东西解释DbContext C#代码和许多免费提供的代码转换器在db和Object上下文特定代码方面存在问题。
您是否知道如何翻译这些内容并解释为何存在差异?
非常感谢
答案 0 :(得分:1)
有一种更简单的方法,使用DbContext
,您可以覆盖SaveChanges
方法,该方法为实现此类要求提供了更好的钩子:
public class FooDbContext : DbContext
{
...
public override int SaveChanges()
{
// this is where you plug your custom logic
foreach ( var entriey in this.ChangeTracker.Entries()
.Where( e => e.State == EntityState.Added ||
e.State == EntityState.Modified
) )
{
// the inner loop from Julie's code follows here
}
return base.SaveChanges(); // make sure the base implementation is called
}
}
如果您不满意并仍然想要ObjectContext
,那就在那里。这也回答了您的另一个问题 - dbcontext在内部使用对象上下文。你可以得到它:
var objectContext = ( (IObjectContextAdapter)dbContext ).ObjectContext;