2014-01-09 66 views
2

問題實體框架6 - GetObjectStateEntries預期修改實體有狀態「不變」

當我創建我的帳戶級爲例A,對象出現在我的SaveChanges狀態「EntityState.Modified」() - 方法如預期。

當我使用示例B時,該對象顯示爲「EntityState.Unchanged」,並且在GetObjectStateEntries(EntityState.Added | EntityState.Modified)調用的結果中沒有apear。

任何人都可以向我解釋爲什麼模型對象在示例B中顯示不變,而一切在示例A中工作?

三江源

我更新 '創造' 和我的語境對象 'LASTUPDATED' 使用這種方法:

public class CrmContext : DbContext 
{ 

public override int SaveChanges() 
{ 
    DateTime now = DateTime.Now; 
    foreach (ObjectStateEntry entry in (this as IObjectContextAdapter).ObjectContext.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Modified)) 
    { 
     if (!entry.IsRelationship) 
     { 
      var account = entry.Entity as Account; 
      if (account != null) 
      { 
       account.LastUpdated = now; 
       if (entry.State == EntityState.Added) 
       { 
        account.Created = now; 
       } 
      } 
     } 
    } 

    return base.SaveChanges(); 
} 

} 

模型實施例A(工作):

public class Account 
{ 
[Key] 
public int AccountId { get; set; } 
public string Name { get; set; } 
[Timestamp] 
public Byte[] TimeStamp { get; set; } 
public DateTime Created { get; set; } 
public DateTime LastUpdated { get; set; } 
} 

模型示例B(NOT WORKING):

public class Account : BaseObject 
{ 
[Key] 
public int AccountId { get; set; } 
public string Name { get; set; } 
} 
public class BaseObject 
{ 
[Timestamp] 
public Byte[] TimeStamp { get; set; } 
public DateTime Created { get; set; } 
public DateTime LastUpdated { get; set; } 
} 

UPDATE:

的問題似乎並不有什麼做的模型類是否從基類繼承與否,我不能沒有使用複製的工作示例建議DetectChanges()調用。

回答

8

您應該在重寫SaveChanges方法的開頭手動調用變化檢測:

public override int SaveChanges() 
{ 
    this.ChangeTracker.DetectChanges(); 

    //... 
} 

我沒有解釋,爲什麼實體狀態可能是模型A和模型B但要DetectChanges的未接來電的不同通常可以是爲什麼實體處於Unchanged(暫時)狀態,儘管它已被修改。例如,如果您有POCO實體(不更改跟蹤代理),只需加載實體,更改屬性,然後調用您的覆蓋SaveChanges狀態將爲Unchanged,直到base.SaveChanges被調用,它將更新狀態爲Modified並保存更改到數據庫。但是設置LastUpdated屬性的代碼將被跳過,並且LastUpdated在數據庫中具有舊值。

+0

固定它。 Thankyou非常花時間寫這篇文章。 :) –

+0

太棒了。非常感謝。 –