如何在 Fluent NHibernate 中使用 ConventionBuilder 设置实体的 ID
How do I setup Id of entity with a ConventionBuilder in Fluent NHibernate
我有以下流利的配置
var sessionFactory = Fluently.Configure()
.Database(configuration)
.Mappings(arg =>
{
var autoMap = AutoMap.Source(typeSource);
foreach (var convention in typeSource.GetConventions())
{
autoMap.Conventions.Add(convention);
}
autoMap.BuildMappings();
})
.BuildSessionFactory();
我使用 FluentNHibernate.ITypeSource
的一个实例 (typeSource
),它也有一个方法 GetConventions
,returns System.Collections.Generic.IEnumerable<FluentNHibernate.Conventions.IConvention>
.
然后使用GetConventions
的结果注入FluentNHibernate.Automapping.Automap
的Conventions
(在流畅配置的Mappings
方法中)。
GetConventions
的具体实现看起来像
public override System.Collections.Generic.IEnumerable<FluentNHibernate.Conventions.IConvention> GetConventions()
{
yield return FluentNHibernate.Conventions.Helpers.ConventionBuilder.Property.When(
arg => arg.Expect(f => f.Type == typeof (string)),
arg => arg.CustomType<CUSTOMTYPE>()
);
}
我还想介绍一个基于 EntityType
注入 ID 的约定,我曾尝试这样做:
yield return FluentNHibernate.Conventions.Helpers.ConventionBuilder.Class.When(
arg => arg.Expect(f => f.EntityType == typeof (ENTITYTYPE)),
arg => arg.Id // does not work, as .Id is readonly
);
那么,如何在 ConventionBuilder 中注入 ID,可能还有 CombinedID?
编辑:
我也试过这个,但遗憾的是应用路径中的断点 (var a = 1;
) 从未达到:
yield return FluentNHibernate.Conventions.Helpers.ConventionBuilder.Id.When(
arg => arg.Expect(f => f.EntityType == typeof(ENTITYTYPE)),
arg =>
{
var a = 1;
}
);
我通过稍微扩展 Mappings
-call 解决了这个问题:
.Mappings(arg =>
{
var autoPersistenceModel = AutoMap.Source(typeSource);
foreach (var overrideType in typeSource.GetOverrideTypes())
{
autoPersistenceModel.Override(overrideType);
}
foreach (var conventionType in typeSource.GetConventionTypes())
{
autoPersistenceModel.Conventions.Add(conventionType);
}
arg.AutoMappings.Add(autoPersistenceModel);
})
不幸的是,这远非优雅或完整 - 如果 AutoMap.Source(typeSource)
可以处理来自 GetTypes
方法的约定和覆盖,或者如果 IIdConvention
将被采用,那就更好了考虑构建地图(它不是 atm)...
我有以下流利的配置
var sessionFactory = Fluently.Configure()
.Database(configuration)
.Mappings(arg =>
{
var autoMap = AutoMap.Source(typeSource);
foreach (var convention in typeSource.GetConventions())
{
autoMap.Conventions.Add(convention);
}
autoMap.BuildMappings();
})
.BuildSessionFactory();
我使用 FluentNHibernate.ITypeSource
的一个实例 (typeSource
),它也有一个方法 GetConventions
,returns System.Collections.Generic.IEnumerable<FluentNHibernate.Conventions.IConvention>
.
然后使用GetConventions
的结果注入FluentNHibernate.Automapping.Automap
的Conventions
(在流畅配置的Mappings
方法中)。
GetConventions
的具体实现看起来像
public override System.Collections.Generic.IEnumerable<FluentNHibernate.Conventions.IConvention> GetConventions()
{
yield return FluentNHibernate.Conventions.Helpers.ConventionBuilder.Property.When(
arg => arg.Expect(f => f.Type == typeof (string)),
arg => arg.CustomType<CUSTOMTYPE>()
);
}
我还想介绍一个基于 EntityType
注入 ID 的约定,我曾尝试这样做:
yield return FluentNHibernate.Conventions.Helpers.ConventionBuilder.Class.When(
arg => arg.Expect(f => f.EntityType == typeof (ENTITYTYPE)),
arg => arg.Id // does not work, as .Id is readonly
);
那么,如何在 ConventionBuilder 中注入 ID,可能还有 CombinedID?
编辑:
我也试过这个,但遗憾的是应用路径中的断点 (var a = 1;
) 从未达到:
yield return FluentNHibernate.Conventions.Helpers.ConventionBuilder.Id.When(
arg => arg.Expect(f => f.EntityType == typeof(ENTITYTYPE)),
arg =>
{
var a = 1;
}
);
我通过稍微扩展 Mappings
-call 解决了这个问题:
.Mappings(arg =>
{
var autoPersistenceModel = AutoMap.Source(typeSource);
foreach (var overrideType in typeSource.GetOverrideTypes())
{
autoPersistenceModel.Override(overrideType);
}
foreach (var conventionType in typeSource.GetConventionTypes())
{
autoPersistenceModel.Conventions.Add(conventionType);
}
arg.AutoMappings.Add(autoPersistenceModel);
})
不幸的是,这远非优雅或完整 - 如果 AutoMap.Source(typeSource)
可以处理来自 GetTypes
方法的约定和覆盖,或者如果 IIdConvention
将被采用,那就更好了考虑构建地图(它不是 atm)...