gpt4 book ai didi

asp.net-mvc - 实体的 nhibernate : a different object with the same identifier value was already associated with the session: 2,:

转载 作者:行者123 更新时间:2023-12-03 10:50:18 25 4
gpt4 key购买 nike

当我尝试将我的“公司”实体保存在我的 mvc 应用程序中时出现以下错误

具有相同标识符值的不同对象已与 session 关联: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();
}
}

}

和 session 助手
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 : a different object with the same identifier value was already associated with the session: 2,:,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2983749/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com