我從包含public virtual DateTime? LastModified
屬性的ModelBase派生出所有業務對象。它還實現了接口
public interface IHasLastModified
{
DateTime? LastModified { get; set; }
}
然後我重寫我的DbContext
SaveChanges()
尋找被添加或修改實現IHasLastModified
什麼,並設置修改時間戳。
在附註中,EF在調試器中顯示DbEntityValidationException
的詳細信息很古怪。出於這個原因,在這段代碼中,我還通過構建errorList
來處理 異常,這很容易在調試器中查看,並且還記錄了詳細信息。在我的代碼中,logger
是一個NLog記錄器。你可以用 使用任何其他記錄器,或刪除該行。
public override int SaveChanges()
{
try
{
DateTime now = DateTime.UtcNow;
foreach (ObjectStateEntry entry in (this as IObjectContextAdapter).ObjectContext.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Modified))
{
//logger.Info("Setting LastModified on " + entry.Entity.GetType().FullName);
if (!entry.IsRelationship)
{
IHasLastModified lastModified = entry.Entity as IHasLastModified;
if (lastModified != null)
lastModified.LastModified = now;
}
}
return base.SaveChanges();
}
catch (DbEntityValidationException valEx)
{
List<string> errorList = new List<string>();
foreach (var error in valEx.EntityValidationErrors)
{
foreach (var entry in error.ValidationErrors)
{
errorList.Add(entry.PropertyName + ": " + entry.ErrorMessage);
}
logger.Error(string.Join(";", errorList));
}
throw;
}
}
於地址保存,教育發生在其他的DbContext實體,從而節省的人。
合併跨多個DbContext實例的更改非常非常棘手。 EF不提供對所有情況的全面支持。
我強烈建議避免這種情況。傳遞一個DbContext的單個實例,而不是嘗試合併來自兩個DbContext圖像的更改。
如果您確實想要嘗試管理兩個上下文實例中發生的更改,請查看this writeup。請注意結論性意見
截至今天,EF不支持全對象圖合併,並讓您自己管理。
爲什麼你在1到多表中使用擺臺?你的意思是多對多的關係(許多用戶可以有相同的教育或地址)? –