我有以下用于FluentNHibernate自动映射的IIdConvention。我希望我的所有id属性都使用由string属性表示的自定义类型,但是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属性的类型,所以它不是按照我的约定设置的。
如果我使用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();谢谢。
发布于 2010-11-17 21:44:37
我不认为你可以通过约定来达到你想要的效果。
您可以尝试的一件事是让您的所有entities子类都来自一个抽象实体,该实体定义了Id属性并为其提供了自定义类型映射。我不建议这样做,但它只会为更多的自动映射问题打开空间。
只需为每个类映射获取手动CustomType即可。
发布于 2011-10-06 18:45:11
我也遇到了同样的问题,如果FNH的IIdConvention支持这一点就太好了。
在尝试了一些东西并阅读了本文之后,我已经接受了使用自定义Id类型为实体实现IAutoMappingOverride。
public class ProductMap : IAutoMappingOverride<Product>
{
public void Override(AutoMapping<Product> mapping)
{
mapping.Id(x => x.Id).CustomType<ProductId>();
}
}使用自动映射覆盖而不是ClassMap将继续自动映射您的其余属性。修改您的AutoMappings初始化代码以包含
.Overrides.AddFromAssemblyOf<BaseEntity>()发布于 2011-12-22 03:01:43
我也遇到了同样的问题。我认为它是由调用Conventions.AddFromAssemblyOf<BaseEntity>()引起的,这导致您的自定义约定无法应用。
(顺便说一句,发布的代码只有在约定类与BaseEntity位于同一程序集中时才能工作-使用Conventions.AddFromAssemblyOf<PrimaryKeyHasTableName>()可能更安全)
早在2011年2月就出现了一个关于AddFromAssemblyOf的bug:Fluent NHibernate - Setting CutomType IIdConvention。没有发布任何解决方案。
解决方法似乎是显式地添加每个约定
Conventions.Add<PrimaryKeyHasTableName>()要检查这一点,您可以在添加自动映射的行之后添加以下行,以便将映射导出到硬盘上的hbm.xml文件,并查看生成的映射。
m.AutoMappings.ExportTo(@"C:\ExportedMappings")另外,我建议您在Apply方法中添加一个断点,并运行代码以确保它被调用。)
https://stackoverflow.com/questions/4176621
复制相似问题