Fluent NHibernate-设置CutomType IID转换

Fluent NHibernate-设置CutomType IID转换,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,对于FluentNHibernate自动映射,我有以下IID转换。我希望我的所有id属性都使用由字符串属性表示的自定义类型,但该自定义类型从未应用于我的映射 public class PrimaryKeyHasTableName : FluentNHibernate.Conventions.IIdConvention { public void Apply(FluentNHibernate.Conventions.Instances.IIdentityInstance instance)

对于FluentNHibernate自动映射,我有以下IID转换。我希望我的所有id属性都使用由字符串属性表示的自定义类型,但该自定义类型从未应用于我的映射

public class PrimaryKeyHasTableName : FluentNHibernate.Conventions.IIdConvention
{
    public void Apply(FluentNHibernate.Conventions.Instances.IIdentityInstance instance)
    {           
        instance.Column(instance.EntityType.Name + "Id");
        instance.CustomType<CustomIdType>();
    }
}
公共类PrimaryKeyHasTableName:FluentNHibernate.Conventions.IIdConvention
{
public void Apply(FluentNHibernate.Conventions.Instances.IIdentityInstance实例)
{           
列(instance.EntityType.Name+“Id”);
CustomType();
}
}
当我查看FluentNHibernate源时,似乎已经设置了id属性的类型,因此它不是按照我的约定设置的

如果我使用ClassMap手动映射类,那么为Identity属性设置CustomType不会有问题

 Id(x => x.Id)
      .Column("UserId")                
      .CustomType<OnFileIdType>();
Id(x=>x.Id)
.列(“用户ID”)
.CustomType();
有人知道如何使用约定成功设置自定义id属性吗

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

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

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();
流利。配置()
.Database(MsSqlConfiguration.MsSql2005.ConnectionString(connString))
.Mappings(m=>
{
m、 FluentMappings.AddFromAssemblyOf();
m、 AutoMappings.Add(AutoMap.AssemblyOf())
.Where(t=>t.Namespace.EndsWith(“Models.Domain”))
.Conventions.AddFromAssemblyOf()
.UseOverridesFromAssemblyOf()的
);
})
.ExposeConfiguration(CreateSchema)
.BuildSessionFactory();

谢谢。

我认为你不能用惯例来实现你想要的

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


只需为每个类映射选择手动自定义类型。

我认为使用约定无法实现您想要的效果

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


只需为每个类映射选择手动自定义类型。

我遇到了完全相同的问题,如果FNH的IIdConvention支持这一点,那就太好了

在尝试了一些东西并阅读了本文之后,我已经开始为实体实现IAutoMappingOverride,使用自定义类型作为其Id

public class ProductMap : IAutoMappingOverride<Product>
{
    public void Override(AutoMapping<Product> mapping)
    {
        mapping.Id(x => x.Id).CustomType<ProductId>();
    }
}
public类ProductMap:IAutoMappingOverride
{
公共无效替代(自动映射)
{
mapping.Id(x=>x.Id).CustomType();
}
}
使用自动映射覆盖而不是类映射将继续自动映射其余属性。更改您的自动映射初始化代码以包括

.Overrides.AddFromAssemblyOf<BaseEntity>()
.Overrides.AddFromAssemblyOf()的

我遇到了完全相同的问题,如果FNH的IIdConvention支持这一点,那就太好了

在尝试了一些东西并阅读了本文之后,我已经开始为实体实现IAutoMappingOverride,使用自定义类型作为其Id

public class ProductMap : IAutoMappingOverride<Product>
{
    public void Override(AutoMapping<Product> mapping)
    {
        mapping.Id(x => x.Id).CustomType<ProductId>();
    }
}
public类ProductMap:IAutoMappingOverride
{
公共无效替代(自动映射)
{
mapping.Id(x=>x.Id).CustomType();
}
}
使用自动映射覆盖而不是类映射将继续自动映射其余属性。更改您的自动映射初始化代码以包括

.Overrides.AddFromAssemblyOf<BaseEntity>()
.Overrides.AddFromAssemblyOf()的

我也遇到了同样的问题。我认为这是由于调用了
约定.AddFromAssemblyOf()
,导致您的自定义约定无法应用

(顺便说一句,只有当您的约定类与BaseEntity位于同一程序集中时,发布的代码才会起作用-使用
约定可能更安全。AddFromAssemblyOf()

有关AddFromAssemblyOf的错误在2011年2月提出:。没有公布决议

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

Conventions.Add<PrimaryKeyHasTableName>()

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

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

(顺便说一句,只有当您的约定类与BaseEntity位于同一程序集中时,发布的代码才会起作用-使用
约定可能更安全。AddFromAssemblyOf()

有关AddFromAssemblyOf的错误在2011年2月提出:。没有公布决议

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

Conventions.Add<PrimaryKeyHasTableName>()

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

我使用FluentMappings和一个基本实体实现了这一点,但即使在为每个类创建重写映射时,也无法使AutoMappings接受CustomType。将FluentMapping与Automapping混合有时会导致麻烦当自动映射器需要引用显式映射实体中的特殊类型或列名时。你为什么不让自动映射器映射你的基本实体?您是否尝试使用IgnoreBase?我使用FluentMappings和基本实体实现了这一点,但即使在为每个类创建重写映射时,也无法使AutoMappings接受CustomType。将FluentMapping与Automapping混合有时会导致麻烦。当自动映射程序需要引用expl中的特殊类型或列名时