asp.Net   发布时间:2022-04-04  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了asp.net-mvc – nhibernate:具有相同标识符值的不同对象已经与会话相关联:2,实体:大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
当我在我的mvc应用程序中尝试并保存我的“公司”实体时,我收到以下错误

有相同标识符值的不同对象已经与会话相关联: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);
    }
@H_801_22@

解决方法

我知道这有点迟了,你可能已经找到了解决方案,但也许其他人可以从中受益

当您更新保存在缓存中的实体的实例时,会从nHibernate引发此错误。基本上,nHibernate在加载缓存后将对象存储在缓存中,因此下一次调用将从缓存中获取。如果更新缓存上存在的实例nHibernate会抛出此错误,否则可能会在加载对象的旧副本时造成脏读和冲突。
要解决这个问题,您需要使用Evict方法从缓存中删除对象,如:

public ActionResult Edit(EStore.Domain.Model.Company company) 
{ 

        if (company.Id > 0) 
        { 
            **ISession.Evict(company);**
            _companyRepository.update(company);

希望这可以帮助。

@H_801_22@ @H_801_22@

大佬总结

以上是大佬教程为你收集整理的asp.net-mvc – nhibernate:具有相同标识符值的不同对象已经与会话相关联:2,实体:全部内容,希望文章能够帮你解决asp.net-mvc – nhibernate:具有相同标识符值的不同对象已经与会话相关联:2,实体:所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。