如何在 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.AutomapConventions(在流畅配置的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)...