首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Fluent NHibernate - Setting CutomType IIdConvention

Fluent NHibernate - Setting CutomType IIdConvention
EN

Stack Overflow用户
提问于 2010-11-14 15:39:40
回答 3查看 1.4K关注 0票数 2

我有以下用于FluentNHibernate自动映射的IIdConvention。我希望我的所有id属性都使用由string属性表示的自定义类型,但是CustomType从未应用到我的映射中。

代码语言:javascript
复制
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是没有问题的。

代码语言:javascript
复制
 Id(x => x.Id)
      .Column("UserId")                
      .CustomType<OnFileIdType>();

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

或者让我的约定在映射过程中更早地运行,这样在我的代码运行时还没有设置Type。

另外,下面是我的配置代码:

代码语言:javascript
复制
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();

谢谢。

EN

回答 3

Stack Overflow用户

发布于 2010-11-17 21:44:37

我不认为你可以通过约定来达到你想要的效果。

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

只需为每个类映射获取手动CustomType即可。

票数 0
EN

Stack Overflow用户

发布于 2011-10-06 18:45:11

我也遇到了同样的问题,如果FNH的IIdConvention支持这一点就太好了。

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

代码语言:javascript
复制
public class ProductMap : IAutoMappingOverride<Product>
{
    public void Override(AutoMapping<Product> mapping)
    {
        mapping.Id(x => x.Id).CustomType<ProductId>();
    }
}

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

代码语言:javascript
复制
.Overrides.AddFromAssemblyOf<BaseEntity>()
票数 0
EN

Stack Overflow用户

发布于 2011-12-22 03:01:43

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

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

早在2011年2月就出现了一个关于AddFromAssemblyOf的bug:Fluent NHibernate - Setting CutomType IIdConvention。没有发布任何解决方案。

解决方法似乎是显式地添加每个约定

代码语言:javascript
复制
Conventions.Add<PrimaryKeyHasTableName>()

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

代码语言:javascript
复制
m.AutoMappings.ExportTo(@"C:\ExportedMappings")

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4176621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档