4

概括:

我想用 Fluent NHibernate Automapper 保存两个同名和不同命名空间的类

语境

我正在写必须将许多不同的对象导入数据库进行测试。我最终会将映射器写入适当的模型。

我一直在使用 code gen 和 Fluent NHibernate 来获取这些 DTO 并将它们直接转储到 db。

异常确实说(尝试使用 auto-import="false")

代码

public class ClassConvention : IClassConvention
{
    public void Apply(IClassInstance instance)
    {
        instance.Table(instance.EntityType.Namespace.Replace(".", "_"));
    }
}

namespace Sample.Models.Test1
{
    public class Test
    {
        public virtual int Id { get; set; }
        public virtual string Something { get; set; }
    }
}

namespace Sample.Models.Test2
{
    public class Test
    {
        public virtual int Id { get; set; }
        public virtual string SomethingElse { get; set; }        
    }
}

这是实际的应用程序代码

            var model = AutoMap.AssemblyOf<Service1>()
                .Where(t => t.Namespace.StartsWith("Sample.Models"))
                .Conventions.AddFromAssemblyOf<Service1>();
            var cfg = Fluently.Configure()
                .Database(
                MySQLConfiguration.Standard.ConnectionString(
                    c => c.Is("database=test;server=localhost;user id=root;Password=;")))
                .Mappings(m => m.AutoMappings.Add(model))
                .BuildConfiguration();
            new SchemaExport(cfg).Execute(false, true, false);

谢谢我真的很感激任何帮助

使用 Fluent Nhibernate RC1 进行更新

4

6 回答 6

7

James Gregory的 fluent-nhibernate 论坛的解决方案

今晚有时间好好看看这个。基本上,这取决于提到的异常的 AutoImport 东西;当 NHibernate 被赋予第一个映射时,它会看到实体以完整的程序集限定名称命名并为短名称创建导入(很有帮助!),然后当您添加第二个映射时,它会抱怨此导入现在会发生冲突。所以解决办法是关闭自动导入;不幸的是,我们没有办法在 RC 中做到这一点……我刚刚提交了一个修复程序,增加了在约定中更改它的能力。因此,如果您获得最新的二进制文件或源代码,您应该能够更改附加项目中的 Conventions 行来执行此操作:

.Conventions.Setup(x =>  {   
  x.AddFromAssemblyOf<Program>();   
  x.Add(AutoImport.Never());  }); 

它添加了您在程序集中定义的所有约定,然后使用其中一种帮助程序约定来关闭自动导入。

于 2009-08-19T07:35:56.933 回答
7

我无法使用 FluentMappings 的约定(与 AutoMappings 相比)使其工作。但是,以下内容对我有用,尽管它必须在需要的地方添加到每个 ClassMap 中。

public class AMap : ClassMap<A> 
{
    public AMap()
    {
        HibernateMapping.Not.AutoImport();
        Map(x => x.Item, "item");
        ...
    }
}
于 2011-05-23T15:44:22.550 回答
0

我对此有真正的问题,上面的例子或其任何变体都没有帮助。

var cfg = new NotifyFluentNhibernateConfiguration();

    return Fluently.Configure()
      .Database(
       FluentNHibernate.Cfg.Db.MsSqlConfiguration.MsSql2005
            .ConnectionString("Server=10.2.65.227\\SOSDBSERVER;Database=NotifyTest;User ID=NHibernateTester;Password=test;Trusted_Connection=False;")
      )

      .Mappings(m => {
          m.AutoMappings
            .Add(AutoMap.AssemblyOf<SubscriptionManagerRP>(cfg));
          m.FluentMappings.Conventions.Setup(x =>
          {
              x.AddFromAssemblyOf<Program>();
              x.Add(AutoImport.Never());
          });
      } )

      .BuildSessionFactory();

我找不到程序的参考..

我还尝试将一个单独的 xml 文件放入绝望的配置中,流畅的 nhibernate 映射到 auto-import = false,但没有成功。

我可以请一些更广泛的例子来说明如何做到这一点吗?

编辑,几周前我拿到了最新的行李箱。

编辑,通过删除所有重复项解决了这个问题。

于 2010-07-27T08:13:40.673 回答
0

我曾经也有过一样的问题。我是这样解决的:

Fluently.Configure()
        .Database(MsSqlConfiguration.MsSql2008
            .ConnectionString(...)
            .AdoNetBatchSize(500))
        .Mappings(m => m.FluentMappings
            .Conventions.Setup(x => x.Add(AutoImport.Never()))
            .AddFromAssembly(...)
            .AddFromAssembly(...)
            .AddFromAssembly(...)
            .AddFromAssembly(...))
        ;

导入的部分是:.Conventions.Setup(x => x.Add(AutoImport.Never())). 使用此配置似乎一切正常。

于 2011-04-29T07:59:00.793 回答
0

使用BeforeBindMapping事件来访问 .HBM XML 文件的对象表示。

此事件允许您在创建 NHibernate 会话工厂之前在运行时修改任何属性。这也使得 FluentNHibernate 等效约定变得不必要。不幸的是,目前没有关于这个非常棒的功能的官方文档。

这是重复映射问题的全局解决方案(请记住,所有 HQL 查询现在都需要使用完全限定类型名称而不仅仅是类名称)。

var configuration = new NHibernate.Cfg.Configuration();

configuration.BeforeBindMapping += (sender, args) => args.Mapping.autoimport = false;
于 2012-05-15T22:57:16.963 回答
0

我不得不尝试在哪里添加约定 AutoImport.Never() 。我将持久性映射分成不同的项目 - 每个应用程序的模型也可以在不同的项目中找到。将它与 Fluent NHibernate 和自动映射一起使用。

在某些情况下,确实必须组合域、井映射。这将是我需要访问所有域的时候。使用的 POCO 类有时会具有相同的名称和不同的命名空间,就像上面的示例一样。

这是我组合所有映射的样子:

internal static class NHIbernateUtility
{
    public static ISessionFactory CreateSessionFactory(string connectionString)
    {
        return Fluently.Configure()
            .Database(
                MsSqlConfiguration
                    .MsSql2008
                    .ConnectionString(connectionString))
            .Mappings(m => m.AutoMappings
                .Add(ProjectA.NHibernate.PersistenceMapper.CreatePersistenceModel()))
            .Mappings(m => m.AutoMappings
                .Add(ProjectB.NHibernate.PersistenceMapper.CreatePersistenceModel()))
            .Mappings(m => m.AutoMappings
                .Add(ProjectC.NHibernate.PersistenceMapper.CreatePersistenceModel())).BuildSessionFactory();
    }
}

以及持久性映射器之一:

public static class PersistenceMapper
{
    public static AutoPersistenceModel CreatePersistenceModel()
    {
        return
            AutoMap.AssemblyOf<Credential>(new AutoMapConfiguration())
                .IgnoreBase<BaseEntity>()
                .Conventions.Add(AutoImport.Never())
                .Conventions.Add<TableNameConvention>()
                .Conventions.Add<StandardForeignKeyConvention>()
                .Conventions.Add<CascadeAllConvention>()
                .Conventions.Add<StandardManyToManyTableNameConvention>()
                .Conventions.Add<PropertyConvention>();
    }
}

每个 POCO 命名空间的持久性映射器都非常相似——有些具有覆盖。我必须将 .Conventions.Add(AutoImport.Never()) 添加到每个持久性映射器,它就像一个魅力。

如果其他人这样做,只是想分享这个。

于 2014-01-16T10:27:12.657 回答