所以我正在研究这个实体框架项目,它将被用作一种 DAL,并且在运行压力测试时(通过 Thread() 开始对实体进行一些更新),我得到了这些:
_innerException = {“事务(进程 ID 94)与另一个进程在锁资源上死锁,并已被选为死锁牺牲品。重新运行事务。”}
这是我如何实现类的方法的一些示例:
public class OrderController
{
public Order Select(long orderID)
{
using (var ctx = new BackEndEntities())
{
try
{
var res = from n in ctx.Orders
.Include("OrderedServices.Professional")
.Include("Agency")
.Include("Agent")
where n.OrderID == orderID
select n;
return res.FirstOrDefault();
}
catch (Exception ex)
{
throw ex;
}
}
}
public bool Update(Order order)
{
using (var ctx = new BackEndEntities())
{
try
{
order.ModificationDate = DateTime.Now;
ctx.Orders.Attach(order);
ctx.SaveChanges();
return true;
}
catch (Exception ex)
{
throw ex;
}
}
}
}
和:
public class AgentController
{
public Agent Select(long agentID)
{
using (var ctx = new BackEndEntities())
{
try
{
var res = from n in ctx.Agents.Include("Orders")
where n.AgentID == agentID
select n;
return res.FirstOrDefault();
}
catch (Exception ex)
{
throw ex;
}
}
}
public bool Update(Agent agent)
{
using (var ctx = new BackEndEntities())
{
try
{
agent.ModificationDate = DateTime.Now;
ctx.Agents.Attach(agent);
ctx.ObjectStateManager.ChangeObjectState(agent, System.Data.EntityState.Modified);
ctx.SaveChanges();
return true;
}
catch (Exception ex)
{
throw ex;
}
}
}
}
显然,这里的代码可能会更好,但我是一个 EF 新手。但我认为我的问题是上下文的设计问题。
我记得这里有人提到,如果我的上下文不共享,我就不会遇到这些死锁问题。
这对我来说似乎不是“共享的”,因为我在每种方法中都使用了 new BackEndEntities(),那么我必须进行哪些更改才能使其更健壮?
此 DAL 将用于在 Internet 上公开的 Web 服务(经过代码审查之后),因此我无法控制它的压力程度,并且许多不同的实例可能想要更新同一个实体。
谢谢!