Closed
Description
Hello,
we are trying to update from a custom NHibernate 5.2.5 version to the a custom 5.3.8 build and are facing some mapping problems in context of joins with models with an interface.
Here are some simple unit tests, which i've added to your Test project of the current 5.3.8 branch, to reproduce the problem.
[Test("Working")]
public async Task IlogsTest1()
{
var query = db.Users
.Select(u => u.Name);
await query.ToListAsync();
}
[Test("Working")]
public async Task IlogsTest2()
{
var query = db.IUsers
.Select(u => u.Name);
await query.ToListAsync();
}
[Test("Not Working")]
public async Task IlogsTest3()
{
var query = db.Users.Join(db.IUsers,
u => u.Id,
iu => iu.Id,
(u, iu) => iu.Name);
await query.ToListAsync();
}
[Test("Working")]
public async Task IlogsTest4()
{
var query = db.IUsers.Join(db.Users,
iu => iu.Id,
u => u.Id,
(iu, u) => u.Name);
await query.ToListAsync();
}
The exception:
NHibernate.Test.Linq.LinqQuerySamplesAsync.IlogsTest3
NHibernate.Hql.Ast.ANTLR.QuerySyntaxException : NHibernate.DomainModel.Northwind.Entities.IUser is not mapped [.Join[NHibernate.DomainModel.Northwind....
NHibernate.Hql.Ast.ANTLR.QuerySyntaxException : NHibernate.DomainModel.Northwind.Entities.IUser is not mapped [.Join[NHibernate.DomainModel.Northwind.Entities.User, NHibernate.DomainModel, Version=5.4.0.0, Culture=neutral, PublicKeyToken=null,NHibernate.DomainModel.Northwind.Entities.IUser, NHibernate.DomainModel, Version=5.4.0.0, Culture=neutral, PublicKeyToken=null,System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089,System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089](NHibernate.Linq.NhQueryable`1[NHibernate.DomainModel.Northwind.Entities.User], NHibernate.Linq.NhQueryable`1[NHibernate.DomainModel.Northwind.Entities.IUser], Quote((u, ) => (u.Id)), Quote((iu, ) => (iu.Id)), Quote((u, iu, ) => (iu.Name)), )]
at NHibernate.Hql.Ast.ANTLR.SessionFactoryHelperExtensions.RequireClassPersister(String name) in C:\git\Repositories\Tools\NHibernate\Default\Core\src\NHibernate\Hql\Ast\ANTLR\SessionFactoryHelperExtensions.cs:line 273
at NHibernate.Hql.Ast.ANTLR.HqlSqlWalker.ResolveEntityJoinReferencedPersister(IASTNode path) in C:\git\Repositories\Tools\NHibernate\Default\Core\src\NHibernate\Hql\Ast\ANTLR\HqlSqlWalker.cs:line 803
at NHibernate.Hql.Ast.ANTLR.HqlSqlWalker.CreateFromJoinElement(IASTNode path, IASTNode alias, Int32 joinType, IASTNode fetchNode, IASTNode propertyFetch, IASTNode with) in C:\git\Repositories\Tools\NHibernate\Default\Core\src\NHibernate\Hql\Ast\ANTLR\HqlSqlWalker.cs:line 709
at NHibernate.Hql.Ast.ANTLR.HqlSqlWalker.joinElement() in C:\git\Repositories\Tools\NHibernate\Default\Core\src\NHibernate\obj\Debug\net461\HqlSqlWalker.cs:line 5510
at NHibernate.Hql.Ast.ANTLR.HqlSqlWalker.fromElement() in C:\git\Repositories\Tools\NHibernate\Default\Core\src\NHibernate\obj\Debug\net461\HqlSqlWalker.cs:line 5084
at NHibernate.Hql.Ast.ANTLR.HqlSqlWalker.fromElementList() in C:\git\Repositories\Tools\NHibernate\Default\Core\src\NHibernate\obj\Debug\net461\HqlSqlWalker.cs:line 4813
at NHibernate.Hql.Ast.ANTLR.HqlSqlWalker.fromClause() in C:\git\Repositories\Tools\NHibernate\Default\Core\src\NHibernate\obj\Debug\net461\HqlSqlWalker.cs:line 4716
at NHibernate.Hql.Ast.ANTLR.HqlSqlWalker.unionedQuery() in C:\git\Repositories\Tools\NHibernate\Default\Core\src\NHibernate\obj\Debug\net461\HqlSqlWalker.cs:line 1756
at NHibernate.Hql.Ast.ANTLR.HqlSqlWalker.query() in C:\git\Repositories\Tools\NHibernate\Default\Core\src\NHibernate\obj\Debug\net461\HqlSqlWalker.cs:line 1583
at NHibernate.Hql.Ast.ANTLR.HqlSqlWalker.selectStatement() in C:\git\Repositories\Tools\NHibernate\Default\Core\src\NHibernate\obj\Debug\net461\HqlSqlWalker.cs:line 432
at NHibernate.Hql.Ast.ANTLR.HqlSqlWalker.statement() in C:\git\Repositories\Tools\NHibernate\Default\Core\src\NHibernate\obj\Debug\net461\HqlSqlWalker.cs:line 310
at NHibernate.Hql.Ast.ANTLR.HqlSqlTranslator.Translate() in C:\git\Repositories\Tools\NHibernate\Default\Core\src\NHibernate\Hql\Ast\ANTLR\QueryTranslatorImpl.cs:line 613
at NHibernate.Hql.Ast.ANTLR.QueryTranslatorImpl.Analyze(String collectionRole) in C:\git\Repositories\Tools\NHibernate\Default\Core\src\NHibernate\Hql\Ast\ANTLR\QueryTranslatorImpl.cs:line 459
at NHibernate.Hql.Ast.ANTLR.QueryTranslatorImpl.DoCompile(IDictionary`2 replacements, Boolean shallow, String collectionRole) in C:\git\Repositories\Tools\NHibernate\Default\Core\src\NHibernate\Hql\Ast\ANTLR\QueryTranslatorImpl.cs:line 399
at NHibernate.Hql.Ast.ANTLR.QueryTranslatorImpl.Compile(IDictionary`2 replacements, Boolean shallow) in C:\git\Repositories\Tools\NHibernate\Default\Core\src\NHibernate\Hql\Ast\ANTLR\QueryTranslatorImpl.cs:line 91
at NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory.CreateQueryTranslators(IQueryExpression queryExpression, IASTNode ast, String queryIdentifier, String collectionRole, Boolean shallow, IDictionary`2 filters, ISessionFactoryImplementor factory) in C:\git\Repositories\Tools\NHibernate\Default\Core\src\NHibernate\Hql\Ast\ANTLR\ASTQueryTranslatorFactory.cs:line 43
at NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory.CreateQueryTranslators(IQueryExpression queryExpression, String collectionRole, Boolean shallow, IDictionary`2 filters, ISessionFactoryImplementor factory) in C:\git\Repositories\Tools\NHibernate\Default\Core\src\NHibernate\Hql\Ast\ANTLR\ASTQueryTranslatorFactory.cs:line 20
at NHibernate.Engine.Query.QueryExpressionPlan.CreateTranslators(IQueryExpression queryExpression, String collectionRole, Boolean shallow, IDictionary`2 enabledFilters, ISessionFactoryImplementor factory) in C:\git\Repositories\Tools\NHibernate\Default\Core\src\NHibernate\Engine\Query\QueryExpressionPlan.cs:line 38
at NHibernate.Engine.Query.QueryExpressionPlan..ctor(IQueryExpression queryExpression, Boolean shallow, IDictionary`2 enabledFilters, ISessionFactoryImplementor factory) in C:\git\Repositories\Tools\NHibernate\Default\Core\src\NHibernate\Engine\Query\QueryExpressionPlan.cs:line 20
at NHibernate.Engine.Query.QueryPlanCache.GetHQLQueryPlan(IQueryExpression queryExpression, Boolean shallow, IDictionary`2 enabledFilters) in C:\git\Repositories\Tools\NHibernate\Default\Core\src\NHibernate\Engine\Query\QueryPlanCache.cs:line 69
at NHibernate.Impl.AbstractSessionImpl.GetHQLQueryPlan(IQueryExpression queryExpression, Boolean shallow) in C:\git\Repositories\Tools\NHibernate\Default\Core\src\NHibernate\Impl\AbstractSessionImpl.cs:line 584
at NHibernate.Impl.AbstractSessionImpl.CreateQuery(IQueryExpression queryExpression) in C:\git\Repositories\Tools\NHibernate\Default\Core\src\NHibernate\Impl\AbstractSessionImpl.cs:line 552
at NHibernate.Linq.DefaultQueryProvider.PrepareQuery(Expression expression, IQuery& query) in C:\git\Repositories\Tools\NHibernate\Default\Core\src\NHibernate\Linq\DefaultQueryProvider.cs:line 208
at NHibernate.Linq.DefaultQueryProvider.<ExecuteListAsync>d__0`1.MoveNext() in C:\git\Repositories\Tools\NHibernate\Default\Core\src\NHibernate\Async\Linq\DefaultQueryProvider.cs:line 40
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult()
at NHibernate.Linq.LinqExtensionMethods.<>c__DisplayClass59_0`1.<<ToListAsync>g__InternalToListAsync|0>d.MoveNext() in C:\git\Repositories\Tools\NHibernate\Default\Core\src\NHibernate\Linq\LinqExtensionMethods.cs:line 2394
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at NHibernate.Test.Linq.LinqQuerySamplesAsync.<IlogsTest3>d__86.MoveNext() in C:\git\Repositories\Tools\NHibernate\Default\Core\src\NHibernate.Test\Async\Linq\LinqQuerySamples.cs:line 1430
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at NUnit.Framework.Internal.TaskAwaitAdapter.GenericAdapter`1.GetResult()
at NUnit.Framework.Internal.AsyncToSyncAdapter.Await(Func`1 invoke)
at NUnit.Framework.Internal.Commands.TestMethodCommand.RunTestMethod(TestExecutionContext context)
at NUnit.Framework.Internal.Commands.TestMethodCommand.Execute(TestExecutionContext context)
at NUnit.Framework.Internal.Commands.BeforeAndAfterTestCommand.<>c__DisplayClass1_0.<Execute>b__0()
at NUnit.Framework.Internal.Commands.BeforeAndAfterTestCommand.RunTestMethodInThreadAbortSafeZone(TestExecutionContext context, Action action)
-----
One or more child tests had errors
Exception doesn't have a stacktrace
It looks like, that domain models with an interface, which applies to all of our models, can't be resolved in case of joins. Maybe there is some code missing which tries to resolve the persister for the model implementation in SessionFactoryHelper::FindEntityPersisterUsingImports
like you did for ExpressionsHelper::TryGetEntityPersister
.
Thanks in advance,
br Michael