大佬教程收集整理的这篇文章主要介绍了asp.net-mvc – nhibernate:具有相同标识符值的不同对象已经与会话相关联:2,实体:,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用IOC容器
private class EStoreDependencies : NinjectModule { public override void Load() { Bind<ICompanyRepository>().To<CompanyRepository>().WithConstructorArgument("session",NHibernateHelper.openSession()); } }
我的公司资料库
public class CompanyRepository : ICompanyRepository { private ISession _session; public CompanyRepository(ISession session) { _session = session; } public void update(Company company) { using (Itransaction transaction = _session.begintransaction()) { _session.update(company); transaction.Commit(); } }
}
和会话助手
public class NHibernateHelper { private static ISessionFactory _sessionFactory; const String SessionKey = "MySession"; private static ISessionFactory SessionFactory { get { if (_sessionFactory == null) { var configuration = new Configuration(); configuration.Configure(); configuration.AddAssembly(typeof(UserProfilE).Assembly); configuration.SetProperty(NHibernate.Cfg.Environment.ConnectionStringName,System.Environment.MachineName); _sessionFactory = configuration.buildSessionFactory(); } return _sessionFactory; } } public static ISession OpenSession() { var context = httpContext.Current; //.GetCurrentSession() if (context != null && context.Items.Contains(SessionKey)) { //Return already open ISession return (ISession)context.Items[SessionKey]; } else { //Create new ISession and store in httpContext var newSession = SessionFactory.openSession(); if (context != null) context.Items[SessionKey] = newSession; return newSession; } } }
我的MVC行动
[httpPost] public ActionResult Edit(EStore.Domain.Model.Company company) { if (company.Id > 0) { _companyRepository.update(company); _statusResponses.Add(StatusResponseHelper.Create(Constants .Recordupdated(),StatusResponseLookup.success)); } else { company.createdbyUserId = currentUserId; _companyRepository.Add(company); } var viewModel = EditViewModel(company.Id,_statusResponses); return View("Edit",viewModel); }
当您更新保存在缓存中的实体的实例时,会从nHibernate引发此错误。基本上,nHibernate在加载缓存后将对象存储在缓存中,因此下一次调用将从缓存中获取。如果更新缓存上存在的实例nHibernate会抛出此错误,否则可能会在加载对象的旧副本时造成脏读和冲突。
要解决这个问题,您需要使用Evict方法从缓存中删除对象,如:
public ActionResult Edit(EStore.Domain.Model.Company company) { if (company.Id > 0) { **ISession.Evict(company);** _companyRepository.update(company);
希望这可以帮助。
以上是大佬教程为你收集整理的asp.net-mvc – nhibernate:具有相同标识符值的不同对象已经与会话相关联:2,实体:全部内容,希望文章能够帮你解决asp.net-mvc – nhibernate:具有相同标识符值的不同对象已经与会话相关联:2,实体:所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。