我应该如何在事务中包装选择语句?
|
我打算将网站与nhibernate Profiler一起投放,并且收到此消息
警告:使用隐式事务是
泄气
http://nhprof.com/Learn/Alerts/DoNotUseImplicitTransactions
我看到它们出现在每个选择语句中。
private readonly ISession session;
public OrderHistoryRepo(ISession session)
{
this.session = session;
}
public void Save(OrderHistory orderHistory)
{
session.Save(orderHistory);
}
public List<OrderHistory> GetOrderHistory(Guid Id)
{
List<OrderHistory> orderHistories = session.Query<OrderHistory>().Where(x => x.Id == Id).ToList();
return orderHistories;
}
public void Commit()
{
using (ITransaction transaction = session.BeginTransaction())
{
transaction.Commit();
}
}
我是否应该像处理提交一样将GetOrderHistory封装为事务?
编辑
如何将选择语句与事务包装在一起?会是这样吗?但是,则永远不会使用“交易”。
public List<OrderHistory> GetOrderHistory(Guid Id)
{
using (ITransaction transaction = session.BeginTransaction())
{
List<OrderHistory> orderHistories = session.Query<OrderHistory>().Where(x => x.Id == Id).ToList();
return orderHistories;
}
}
编辑
Ninject(也许我可以像参加会议那样利用它来帮助我)
public class NhibernateSessionFactory
{
public ISessionFactory GetSessionFactory()
{
ISessionFactory fluentConfiguration = Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2008.ConnectionString(c => c.FromConnectionStringWithKey(\"ConnectionString\")))
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<Map>().Conventions.Add(ForeignKey.EndsWith(\"Id\")))
.ExposeConfiguration(cfg => cfg.SetProperty(\"adonet.batch_size\", \"20\"))
//.ExposeConfiguration(BuidSchema)
.BuildSessionFactory();
return fluentConfiguration;
}
private static void BuidSchema(NHibernate.Cfg.Configuration config)
{
new NHibernate.Tool.hbm2ddl.SchemaExport(config).Create(false, true);
}
}
public class NhibernateSessionFactoryProvider : Provider<ISessionFactory>
{
protected override ISessionFactory CreateInstance(IContext context)
{
var sessionFactory = new NhibernateSessionFactory();
return sessionFactory.GetSessionFactory();
}
}
public class NhibernateModule : NinjectModule
{
public override void Load()
{
Bind<ISessionFactory>().ToProvider<NhibernateSessionFactoryProvider>().InSingletonScope();
Bind<ISession>().ToMethod(context => context.Kernel.Get<ISessionFactory>().OpenSession()).InRequestScope();
}
}
编辑3
如果我这样做
public List<OrderHistory> GetOrderHistory(Guid Id)
{
using (ITransaction transaction = session.BeginTransaction())
{
List<OrderHistory> orderHistories = session.Query<OrderHistory>().Where(x => x.Id == Id).ToList();
return orderHistories;
}
}
我收到此警报
如果我这样做
public List<OrderHistory> GetOrderHistory(Guid Id)
{
using (ITransaction transaction = session.BeginTransaction())
{
List<OrderHistory> orderHistories = session.Query<OrderHistory>().Where(x => x.Id == Id).ToList().ConvertToLocalTime(timezoneId);
transaction.Commit();
return orderHistories;
}
}
我可以摆脱错误,但可以得到意想不到的结果。
例如,当我取回orderHistories时,我将遍历所有这些并将“购买日期”转换为用户本地时间。这是通过为清单创建的扩展方法完成的。
转换后,我将其设置为覆盖对象中的“购买日期”。这样,我不必为字段的一次更改创建新对象。
现在,如果我在调用commit之前进行日期转换,则nhibernate认为我已经更新了该对象并需要提交它。
因此,我在这个问题上悬赏。
如何创建我的方法,而不必在事务中包装每个方法?我已经在会话中使用ninject了,因此尽管我被迫在单个请求中执行多个事务,但是也许我可以利用它。
因此,我不知道每个请求只有一个事务是一种灵魂。
如何确保要临时更改的对象不会意外提交?
我如何在服务层中使用延迟加载。我不想将我的延迟加载内容包含在事务中,因为它通常在我的服务层中使用。
我发现在使用存储库模式时很难找到有关如何执行此操作的示例。通过这些示例,所有内容始终都写在同一笔交易中,而我不想在服务层中拥有交易(这是存储库的工作,而不是我的业务逻辑)
没有找到相关结果
已邀请:
4 个回复
疼嘶桐
这是我注册会话的方式(使用StructureMap):
请记住,这是我已经尝试过的东西,并且发现它在我使用NHibernate的情况下效果很好。其他人可能有不同的意见(当然,这是受欢迎的)。
唤副埂侧壬
系漏
所以我不知道只有一个 每个请求的交易是一个灵魂。 一个会话中有多个事务非常好。我不喜欢等到请求结束提交,因为为时已晚,无法向用户提供良好的反馈。 我如何确保该对象 我要临时使用不要 意外得到承诺? 唯一确定的方法是使用IStatelessSession。不太确定的方法是从会话中逐出对象或清除会话。但是,建议不要使用NHibernate修改持久对象。 我如何在服务层中使用延迟加载。我不 想包围我的懒惰的东西 在交易中,因为通常使用 在我的服务层。 如果您使用的是每次请求会话,则应该不会有问题。但是您是对的,可以在事务之外进行延迟加载。我忽略了这些警告。我想您可以“触摸”所需的每个子对象,以便在事务中进行延迟加载,但我不会打扰。 我不想进行交易 我的服务层(这是 回购不是我的业务逻辑) 我不同意这一点。 UI或业务逻辑应管理事务。 UI是用户表达其意图(保存或取消我的更改)的地方,并且是管理交易的自然场所。
穗揣