【问题标题】:Converting a specific piece of code to work with DbContext as opposed to ObjectContext转换一段特定的代码以使用 DbContext 而不是 ObjectContext
【发布时间】:2014-04-27 00:55:01
【问题描述】:

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

你们中有人知道如何翻译并解释为什么存在差异吗?

非常感谢

【问题讨论】:

    标签: vb.net entity-framework


    【解决方案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;
    

    【讨论】:

    • 非常感谢维克托。我知道两者之间的基本区别,只是目前我无法理解的语法中的一些小细节。
    猜你喜欢
    • 1970-01-01
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    • 2011-10-24
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 2016-07-19
    相关资源
    最近更新 更多