2014-04-26 51 views
0

在Julie Lerman關於實體框架的出色書籍中,她展示了一個簡單的函數,可以自動更改實體的ModifiedDate列(如果碰巧有一個)。下面將特定的一段代碼轉換爲使用DbContext而不是ObjectContext

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自己的關於此主題的書籍) C#代碼),許多免費的代碼轉換器在使用數據庫和對象上下文特定代碼時遇到了問題。

你們中的任何一個人都知道這可以如何翻譯,並解釋爲什麼這種差異存在?

非常感謝

回答

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; 
+0

非常感謝Wiktor。我知道兩者之間的基本區別,它只是語法中的一些小細節,目前可以逃脫我。 –

相關問題