流利的NHibernate - 设置CutomType IIdConvention

时间:2010-11-14 07:39:40

标签: nhibernate fluent-nhibernate

我有一个用于FluentNHibernate自动化的以下IIdConvention。我希望我的所有id属性都使用由字符串属性表示的自定义类型,但CustomType永远不会应用于我的映射。

public class PrimaryKeyHasTableName : FluentNHibernate.Conventions.IIdConvention
{
    public void Apply(FluentNHibernate.Conventions.Instances.IIdentityInstance instance)
    {           
        instance.Column(instance.EntityType.Name + "Id");
        instance.CustomType<CustomIdType>();
    }
}

当我查看FluentNHibernate源时,似乎已经设置了id属性的Type,因此我的约定没有设置它。

如果我使用ClassMap手动映射类,我就没有问题为Identity属性设置CustomType。

 Id(x => x.Id)
      .Column("UserId")                
      .CustomType<OnFileIdType>();

有人知道如何使用约定成功设置自定义ID属性吗?

或者让我的约定在映射过程的早期运行,以便在我的代码运行时尚未设置Type。

另外,这是我的配置代码:

Fluently.Configure()
            .Database(MsSqlConfiguration.MsSql2005.ConnectionString(connString))
            .Mappings(m =>
            {
                m.FluentMappings.AddFromAssemblyOf<BaseEntity>();
                m.AutoMappings.Add(AutoMap.AssemblyOf<BaseEntity>()
                                  .Where(t => t.Namespace.EndsWith("Models.Domain"))
                                  .Conventions.AddFromAssemblyOf<BaseEntity>()
                                  .UseOverridesFromAssemblyOf<BaseEntity>()
                );
            })
            .ExposeConfiguration(CreateSchema)
            .BuildSessionFactory();

感谢。

3 个答案:

答案 0 :(得分:0)

我认为你不能用惯例达到你想要的效果。

您可以尝试的一件事是让所有实体从定义Id属性的抽象实体中继承子类,并为其定制自定义类型。 但是我不建议这样做,它只会为更多自动化问题打开空间。

只需为每个类地图选择手动CustomType。

答案 1 :(得分:0)

我遇到了同样的问题,如果FNH的IIdConvention支持这个问题会很棒。

在尝试了一些事情并阅读本文后,我已经辞职,为实体使用自定义类型的实体实施IAutoMappingOverride。

public class ProductMap : IAutoMappingOverride<Product>
{
    public void Override(AutoMapping<Product> mapping)
    {
        mapping.Id(x => x.Id).CustomType<ProductId>();
    }
}

使用自动覆盖而不是ClassMap将继续自动执行其余属性。更改您的AutoMappings初始化代码以包含

.Overrides.AddFromAssemblyOf<BaseEntity>()

答案 2 :(得分:0)

我遇到了同样的问题。我认为它是由Conventions.AddFromAssemblyOf<BaseEntity>()的调用引起的,这导致您的自定义约定无法应用。

(顺便说一句,只有当您的约定类与BaseEntity在同一个程序集中时,发布的代码才有效 - 使用Conventions.AddFromAssemblyOf<PrimaryKeyHasTableName>()可能更安全

2011年2月提出了一个关于AddFromAssemblyOf的错误:Fluent NHibernate - Setting CutomType IIdConvention。没有公布决议。

解决方法似乎是明确地添加每个公约

Conventions.Add<PrimaryKeyHasTableName>()

要检查这一点,您可以在添加自动化的行之后添加以下行,以便将映射导出到硬盘驱动器上的hbm.xml文件,并查看生成的映射。

m.AutoMappings.ExportTo(@"C:\ExportedMappings")

另外,我建议你在Apply方法中添加一个断点并运行代码以确保它被调用。)