2011-05-28 46 views
0

我有一個ObjectContext的對象。的OnSave該對象的我正在使用的ObjectContext像這樣的動作:Entity Framework關於保存時間的問題

public void SaveChangesAction(ObjectContext context) 
     { 
      // Validate the state of each entity in the context 
      // before SaveChanges can succeed. 
      foreach (ObjectStateEntry entry in 
       context.ObjectStateManager.GetObjectStateEntries(
       EntityState.Added | EntityState.Modified)) 
      { 
       var type = entry.Entity.GetType(); 
       var RepoBase = typeof(RepositoryBase<myEntityFrameworkObject>); 
       MethodInfo mi = RepoBase.GetMethod("GenerateLog"); 
       MethodInfo constructed = mi.MakeGenericMethod(type); 

       constructed.Invoke(this, new object[] { entry.Entity }); 
      } 
     } 

在我的「GenerateLog」方法,我把我的實體,然後從ObjectContext中卸下它(這樣它可以變成一個二進制對象而無需通過所有Lazy Loaded對象)。

轉換成二進制對象後,我創建了另一個保存二進制數據的對象(不同類型)。我打電話給this.ObjectContext.AddObject('TableName', myNewObject);

然後我把這個我的對象我先前分離(entityState是實體的前一個狀態):

if (entity.EntityState != entityState) 
{ 
    this.ObjectContext.AddObject(entity.GetType().Name, entity); 
} 

在這一點上,代碼追溯到SaveChangesAction方法從上面。這兩個對象都不在我的ObjectContext中,因此它們都不會保存到我的數據庫中。
據我所知,我已經做了一些不好的事情,修改了影響它們的ForEach內部的對象,但我不知道該怎麼做,因爲這是我需要在我的ObjectContext保存之前運行的代碼。

回答

1

幾點:

  • 這反映氣味。你知道你有什麼樣的存儲庫,只需將類型作爲查找值的字典即可。
  • 我想知道你的代碼甚至可能運行的可能性如何。如果你在循環中分離實體,它應該修改迭代的集合並拋出異常。這可以通過在狀態管理器查詢中調用ToArrayToList來避免。
  • 你迭代的添加和修改實體和拆卸他們,但之後你總是添加實體如新,所以,而不是更新你試圖插入重複
  • 拆卸對象將打破所有關係的舊實體。我幾乎可以肯定,這種行爲會使關係發生一些變化,並且將對象添加或附加到上下文將不會重新創建它們。
  • 該方法以ObjectContext作爲參數,但你的其他代碼段使用this.ObjectContext所以絕對尚不清楚這些部件如何與自己
  • 沒有context.SaveChanges,所以如果你沒有其他地方調用它,它之所以沒有更改被保存
+0

1)我的一個要求是當我們的EntityFramework改變時我們不需要改變代碼。我們目前有幾百個可以調用這些代碼的對象。至於所有的分離,我同意這是一個問題,這就是爲什麼我提出這個問題,因爲我不明白什麼是可以自己解決的。 – 2011-05-28 23:35:29

相關問題