Я застрял примерно от 12 часов с этой ошибкой, так может ли один помочь мне, по крайней мере, чтобы понять, что это неправильноNHibernate Незаконно пытались связать прокси-сервер с двумя открытыми Sessions
Вот мой код
public virtual void AssignAssets(IList<long?> assetsIds, ManualAssetAssignment<TAsset>.AssignmentMode mode, IQueryableRepository<TAsset, long?> assetRepository)
{
this.Assets.Clear();
if (mode == AssignmentMode.Execlusion)
{
//IList<long?> includedAssetsIds = assetRepository.Find().Where(entity => !assetsIds.Contains(entity.Id)).Select(entity => entity.Id).ToList();
IList<TAsset> includedAssets = assetRepository.Find().Where(entity => !assetsIds.Contains(entity.Id)).ToList();
foreach (var asset in includedAssets)
{
this.Assets.Add(asset);
}
}
else
{
foreach (var assetId in assetsIds)
{
var asset = assetRepository.Get(assetId);
this.Assets.Add(asset);
}
}
_areAssetsEvaluated = true;
}
Вот мой тест
using (var tx = DataSessionContext.Session.BeginTransaction())
{
atm = new Atm(AtmTestData.AutoCompleteCommand(new Atm.SetupCommand() { }), commandDependencyRegistry);
atmRepository.Save(atm);
List<long?> atmIds = new List<long?> { atm.Id };
var command = AtmExpenseTestData.AutoCompleteCommand(new AssetExpense<Atm>.SetupCommand());
expense = new AssetExpense<Atm>
(
command, commandDependencyRegistry
);
var assignCommand1 = new AssetExpense<Atm>.ManualAssetAssignmentCommand()
{
AssetsIds = new List<long?>() { atm.Id.Value },
Mode = ManualAssetAssignment<Atm>.AssignmentMode.Execlusion
};
assignCommand1.Execute(expense, commandDependencyRegistry);
atmAssetExpenseRepository.Save(expense);
tx.Commit();
}
странно то, что, если я заменю этот кусок в моем коде
IList<TAsset> includedAssets = assetRepository.Find().Where(entity => !assetsIds.Contains(entity.Id)).ToList();
foreach (var asset in includedAssets)
{
this.Assets.Add(asset);
}
К этому
IList<long?> includedAssetsIds = assetRepository.Find().Where(entity => !assetsIds.Contains(entity.Id)).Select(entity => entity.Id).ToList();
foreach (var assetId in includedAssetsIds)
{
this.Assets.Add(assetRepository.Get(assetId));
}
Если я заменю его ошибка исчезнет, так может кто-нибудь помочь мне понять эту ошибку.
Edit - Это может быть полезно
Из стека трассировки я получаю, что исключение будет выброшен из этого метода именно на линии 13 return (TId)((ISession)Session).Save(entity);
public virtual TId Save(TAggregateRoot entity, Action commitPostAction, Action rollbackPostAction, bool propagatePostActionError = false)
{
if (entity == null)
{
throw new ArgumentNullException("entity");
}
if (entity is IValidatable)
{
((IValidatable)entity).Validate();
}
RegisterPostActions(commitPostAction, rollbackPostAction, propagatePostActionError);
if (Session is ISession)
{
return (TId)((ISession)Session).Save(entity);
}
else
{
return (TId)((IStatelessSession)Session).Insert(entity);
}
}
как именно вы создаете сеанс? –