我有一个用于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();
感谢。
答案 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方法中添加一个断点并运行代码以确保它被调用。)