代码之家  ›  专栏  ›  技术社区  ›  Andrew Hanson

Fluent NHibernate-设置CutomType IID转换

  •  2
  • Andrew Hanson  · 技术社区  · 14 年前

    对于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>();
        }
    }
    

    当我查看FluentNHibernate源时,似乎已经设置了id属性的类型,因此它不是按照我的约定设置的。

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

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

    有人知道如何使用约定成功设置自定义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();
    

    3 回复  |  直到 14 年前
        1
  •  0
  •   Variant    14 年前

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

        2
  •  0
  •   Jason Duffett    13 年前

    我有完全相同的问题,如果FNH的IID会议支持这一点,那就太好了。

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

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

    .Overrides.AddFromAssemblyOf<BaseEntity>()
    
        3
  •  0
  •   Community Nick Dandoulakis    7 年前

    我也有同样的问题。我认为,这是由于援引了 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方法中添加一个断点,并运行代码以确保它被调用。)