Я пытаюсь использовать формулу для сопоставления свойства типа ICollection, однако, независимо от того, какой метод я использую для определения типа внутри отображения, nHibernate вызывает ошибку.Формула карты для IEnumerable bycode
No parameterless constructor defined for this object.
Вот файл сопоставления
this.Property(
x => x.AllChildIds,
m =>
{
m.Type<NHibernate.Type.ListType>();
m.Access(Accessor.Field);
m.Formula(@"(WITH [Child] ([Id], [ParentId])
AS (SELECT [hs0].[Id],
[hs0].[ParentId]
FROM [Client].[dbo].[HierarchySet] [hs0] (NOLOCK)
WHERE [hs0].[ParentId] IN (SELECT [hs1].[Id]
FROM [Client].[dbo].[HierarchySet] [hs1] (NOLOCK)
WHERE [hs1].[Id] = Id /* @p0 */)
UNION ALL
SELECT [Children].[Id],
[Children].[ParentId]
FROM [Client].[dbo].[HierarchySet](NOLOCK) AS [Children]
JOIN [Child]
ON [Children].[ParentId] = [Child].[Id])
SELECT [Child].[Id]
FROM [Child]
)");
});
А вот мой класс
private readonly ICollection<long> allChildIds;
public virtual IEnumerable<long> AllChildIds { get { return this.allChildIds; } }
Если изменить тип в файле отображения на
m.Type<NHibernate.Type.GenericListType<NHibernate.Type.Int64Type>>();
Затем я получаю ошибку Could not determine type for: System.Collections.Generic.IEnumerable
Я знаю, что SQL сложный, но верно, что на него не должно повлиять?
Редактировать Мои NHibernate конфигурации сеанса
private static Configuration ConfigureNHibernate()
{
var configration = new Configuration();
configration.SessionFactoryName("SessionFactoryName");
configration.DataBaseIntegration(db =>
{
db.Dialect<MsSql2005Dialect>();
db.Driver<SqlClientDriver>();
db.IsolationLevel = IsolationLevel.ReadUncommitted;
db.ConnectionStringName = "database";
db.BatchSize = 20;
db.KeywordsAutoImport = Hbm2DDLKeyWords.AutoQuote;
});
if (ConfigurationManager.AppSettings["nhibernate-cache"] != null)
{
configration.Cache(
x =>
{
x.DefaultExpiration = 300;
x.UseMinimalPuts = true;
x.RegionsPrefix = "client-";
x.Provider<SysCacheProvider>();
x.UseQueryCache = true;
});
}
var mapper = new ModelMapper();
mapper.AddMappings(typeof(MessageInMap).Assembly.GetTypes());
var domainMapping = mapper.CompileMappingForAllExplicitlyAddedEntities();
configration.AddMapping(domainMapping);
configration.AddAuxiliaryDatabaseObject(new SimpleAuxiliaryDatabaseObject(@"
CREATE VIEW [Children]
AS
WITH [Child] ([Id], [ParentId])
AS (
SELECT
[hs0].[Id],
[hs0].[ParentId]
FROM
[isnapshot.Client].[dbo].[HierarchySet] (NOLOCK) AS [hs0]
UNION ALL
SELECT
[Children_].[Id],
[Children_].[ParentId]
FROM
[isnapshot.Client].[dbo].[HierarchySet] (NOLOCK) AS [Children_]
JOIN [Child] ON [Children_].[ParentId] = [Child].[Id]
)
GO", "DROP VIEW [Children]"));
return configration;
}
Что произойдет, если опустить спецификацию типа? В соответствии с [документацией] (http://nhforge.org/doc/nh/en/index.html#mapping-declaration-property) это должно быть хорошо: «Если вы не укажете тип, NHibernate будет использовать отражение по названному свойству, чтобы угадать правильный тип NHibernate ». – bigge
Если я не укажу тип, то ошибка изменится на ICollection 'Не удалось определить тип для: System.Collections.Generic.ICollection' – JConstantine
ОК, это к сожалению. Вы пытались исключить, что запрос является частью проблемы? Работает ли он для более простых запросов (либо с тем же, либо с другим типом результата) – bigge