我有一个使用EF 6数据模型的方法,并且包含在using语句中。在Id中有一些额外的和常见的步骤需要完成,而不是在一个方法中包含它们。下面的代码,虽然不是我使用的确切代码,似乎工作。但是,我想知道是否有任何" gotchyas"我设置与处理DbContext本身的EF特定问题有关。特别是在如何将所有内容都转换为SQL?
主要目标是在调用SaveChanges之前对多个实体执行多个操作,以便隐式事务涵盖所有更改,而不是多次调用SaveChanges,为孤立更改保留选项。
AppendFlagToOrder(ref DbContext tx, ref CustOrder o) {
var oSettings = (from a in tx.OrderSettings where a.Type == o.OrderType select a).FirstOrDefault();
if(!oSettings == null) {
o.IsFlagged = oSettings.Flagged
}
}
CheckOrderFlag(int OrderId) {
using (var ctx = new StoreDbCtx()) {
CustOrder co = (from a in ctx.Orders where a.Id == OrderId select a).FirstOrDefault();
AppendFlagToOrder(ctx,co);
//-- continue with other operations
}
}
答案 0 :(得分:1)
您通常不希望像这样传递DbContext,因为任何人都可以在任何时候调用SaveChanges()。最简单的方法是创建一个只有你想要暴露的DbSets的IStoreDbCtx接口。然后将该类型发送到子方法,这样他们就无法访问您的SaveChanges()。