转换特定的代码片段以使用DbContext而不是ObjectContext

时间:2014-04-26 15:30:03

标签: vb.net entity-framework

在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上下文特定代码方面存在问题。

您是否知道如何翻译这些内容并解释为何存在差异?

非常感谢

1 个答案:

答案 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;