使用AutoMapping流畅的NHibernate DuplicateMappingException

Sco*_*wan 4 mysql fluent-nhibernate automapping

摘要:

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

上下文

我写的是必须将许多不同的对象导入数据库进行测试.我最终会将mappers写成一个合适的模型.

我一直在使用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; }        
    }
}
Run Code Online (Sandbox Code Playgroud)

这是实际的应用程序代码

            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);
Run Code Online (Sandbox Code Playgroud)

谢谢,我非常感谢任何帮助

使用Fluent Nhibernate RC1进行更新

Sco*_*wan 7

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

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

.Conventions.Setup(x =>  {   
  x.AddFromAssemblyOf<Program>();   
  x.Add(AutoImport.Never());  }); 
Run Code Online (Sandbox Code Playgroud)

这会添加您在程序集中定义的所有约定,然后使用其中一个帮助程序约定来关闭自动导入.


小智 6

我无法使用FoursMappings的约定(与AutoMappings相比)使其工作.但是,以下内容适用于我,但必须将其添加到每个需要的ClassMap中.

public class AMap : ClassMap<A> 
{
    public AMap()
    {
        HibernateMapping.Not.AutoImport();
        Map(x => x.Item, "item");
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)