我正在尝试使用公式来映射 ICollection 类型的属性,但是,无论我使用哪种方法来确定映射 nHibernate 中的类型都会引发错误。
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;
}