我在實體更新時遇到以下問題。下面給出的是我的WCF方法。 (更新是由公共Save方法確定後調用它是否更新或補充)實體框架實體狀態在沒有任何修改的情況下被修改
protected bool UpdateSalesMaster(SalesMaster order)
{
using (var context = new MyContext())
{
SalesMaster original = context.SalesMasters.FirstOrDefault(o => o.OrderID == order.OrderID);
if (original != null)
{
context.Entry(original).CurrentValues.SetValues(order);
foreach (SalesDetail detail in order.SalesDetails)
{
if (detail.OrderDetailID == 0)
context.SalesDetails.Add(detail);
else
{
SalesDetails originalDetail = context.SalesDetails.FirstOrDefault(o => o.OrderDetailID == detail.OrderDetailID);
if (originalDetail != null)
context.Entry(originalDetail).CurrentValues.SetValues(detail);
}
}
context.SaveChanges();
return true;
}
else
{
throw new FaultException(string.Format("Invalid Order specified: {0}", order.OrderID));
}
}
}
當我剛剛更新SalesMaster訂購日期和不改變任何細節,更新查詢被激發到數據庫爲細節。我預計只會看到更新查詢SalesMaster。
有人可以讓我知道我在這裏做錯了什麼嗎?如果沒有更改,我不想將更新查詢發送到數據庫。我使用從數據庫中獲取原始值的方法來確定是否使用context.Entry(originalDetail).CurrentValues.SetValues(detail)更新了任何值。
我還通過檢查實體的IAuditable實現來覆蓋SaveChanges以設置LastModified日期。這是當我發現細節實體的狀態被識別爲已修改的時候。但是在數據庫中發生的唯一更新是LastModifiedBy,它在我的保存更改中進行了更新。我不確定在沒有任何細節變化時它是如何設置爲Modified狀態的。
public override int SaveChanges()
{
var changeSet = ChangeTracker.Entries<IAuditable>();
if (changeSet != null)
{
foreach (var entry in changeSet.Where(c => c.State != EntityState.Unchanged))
{
if (entry.State == EntityState.Added)
entry.Entity.DateCreated = DateTime.Now;
if (entry.State == EntityState.Modified)
{
entry.Property(a => a.CreatedByUser).IsModified = false;
entry.Property(a => a.DateCreated).IsModified = false;
}
entry.Entity.DateModified = DateTime.Now;
}
}
try
{
return base.SaveChanges();
}
catch (DbEntityValidationException ex)
{
throw ex;
}
}
我的解決方案的結構是:
- 客戶端 - Windows窗體UI
- 實體 - POCO作爲單獨的庫
- WCF - 所有的業務邏輯,添加,更新,刪除的對象。使用Fluent映射的數據 - 實體框架上下文。
IAuditable是否包含分離對象的修改狀態?你檢查過這些對象的狀態嗎? AFAIK沒有級聯更新,所有事情都需要明確地完成。 – brumScouse 2014-04-28 22:41:45