【发布时间】:2011-06-23 23:07:32
【问题描述】:
这就是我们在 WCF 中为 EF 实体实现通用 Save() 服务的方式。 TT 为我们完成工作。即使我们对此没有任何问题,但我不想假设这是最好的方法(即使它可能是)。你们看起来非常聪明和乐于助人,所以我想我会提出这个问题:
有没有更好的办法?
[OperationContract]
public User SaveUser(User entity)
{
bool _IsDeleted = false;
using (DatabaseEntities _Context = new DatabaseEntities())
{
switch (entity.ChangeTracker.State)
{
case ObjectState.Deleted:
//delete
_IsDeleted = true;
_Context.Users.Attach(entity);
_Context.DeleteObject(entity);
break;
default:
//everything else
_Context.Users.ApplyChanges(entity);
break;
}
// now, to the database
try
{
// try to save changes, which may cause a conflict.
_Context.SaveChanges(System.Data.Objects.SaveOptions.None);
}
catch (System.Data.OptimisticConcurrencyException)
{
// resolve the concurrency conflict by refreshing
_Context.Refresh(System.Data.Objects.RefreshMode.ClientWins, entity);
// Save changes.
_Context.SaveChanges();
}
}
// return
if (_IsDeleted)
return null;
entity.AcceptChanges();
return entity;
}
【问题讨论】:
-
也许最佳 做法是不要编写会导致
OptimisticConcurrencyExceptions 的代码?是什么导致它们发生?我以前从未见过。 -
@StriplingWarrior 有一个很好的观点。你真的有没有从你的代码中发现抛出这个异常?
-
仅在调试情况下。没错。
-
@JerryNixon-MSFT 不错的方法,您如何知道 EF 实体是否已被修改?因为 POCO 实体类没有任何属性来设置它,还是我错了?感谢分享。
-
@VAAA 可追踪实体有办法。是的。
标签: wcf entity-framework self-tracking-entities savechanges