2015-06-22 50 views
1

我正在使用当前版本4.0.3来映射一些MySQL表。但是,我已经在使用automapper创建映射时遇到了问题!原因:一个字节数组!只要添加像“byte()”(vb.net语法)这样的字节数组,我会得到一个异常:使用NHibernate 4映射byte []会抛出.net的数组异常

“数组上的通用接口的接口映射无法被修改。”

似乎这个异常来自.NET的更深层我认为,但事情是:我没有与流利的nhibernate映射这个问题! Fluent确实将我的字节数组映射成了我期望做的longblob。但是,NHibernate 4没有。不幸的是,当Fluent包含一些描述(例如“EmployeeId”)时,Fluent不够巧妙地映射我的Id-Properties。我需要将我的所有属性重命名为“Id”以避免手动映射。因此,我想使用NHibernates automapper,但它似乎无法处理任何类型的数组(我也试过使用整数数组,以及相同的例外情况)。有人有同样的问题吗?这里是我的代码:

Public Cfg As Configuration 
Public Mapping As HbmMapping 
Public SessionFactory As ISessionFactory 

Public Sub New() 
     CreateConfig() 
     Map() 
     SessionFactory = Cfg.BuildSessionFactory() 
End Sub 

Public Sub CreateConfig() 
     Cfg = New Configuration() 
     Cfg.DataBaseIntegration(AddressOf DbIntegration) 
End Sub 

Private Shared Sub DbIntegration(c As IDbIntegrationConfigurationProperties) 
     c.ConnectionString = "Server=xxx;Port=3306;Database=xxx;User ID=xxx;Password=xxx;" 
     c.Driver(Of MySqlDataDriver)() 
     c.Dialect(Of MySQL55Dialect)() 
     c.LogSqlInConsole = True 
     c.LogFormattedSql = True 
     c.AutoCommentSql = True 
    End Sub 

Public Sub Map() 
     Dim automapper As New ConventionModelMapper() 
     Mapping = automapper.CompileMappingFor(Assembly.GetExecutingAssembly().GetExportedTypes().Where(Function(x) x.[Namespace].StartsWith("xxx.Models"))) 
     Cfg.AddMapping(Mapping) 
    End Sub 

所有这一切工作正常,除了包含数组的实体我所有的实体。实际上,我需要使用的唯一阵列是使用字节数组的单个实体中的字节数组。我试图用BeforeMapProperty事件覆盖映射,但是无论如何抛出异常,因为我认为错误发生在该事件之前。

谢谢! 最佳, 克里斯

回答

1

这种情况发生在ConventionModelMapper正在评估byte[],试图弄清楚,如果实体→byte是一个一对多的关系。 NHibernate会看到一个集合并尝试将其作为一对多关系进行处理。

显然这不是真的,因为byte显然不是自定义类型。然而,在大多数情况下,NHibernate会评估这种关系,试图找出可能的“一对多”关系的“多”方面是有意义的。

解决此问题的方法是创建您自己的模型映射器(从ModelMapperConventionModleMapper继承)并定义应用程序中的“实体”。此检查将排除byte类型,并且错误应该消失。

幸运的是,这是非常简单的:

public class MyModelMapper : ConventionModelMapper 
{ 
    public MyModelMapper() 
    { 
     this.IsEntity((type, isDeclared) => 
     { 
      return type.Namespace.StartsWith("Models"); 
     }); 
    } 
} 

然后用MyModelMapper代替。

在我的自动映射(有限)体验中,您很可能必须覆盖约定模型映射器的大部分行为。幸运的是,有一点试验和错误,这不是太难。