2013-03-09 110 views
0

我正在努力寻找能够覆盖我的实体的自动映射的解决方案。FluentNHibernate - 覆盖已经存在的自动映射

执行流程是首先发生AutoMapping(使用约定),然后执行映射覆盖。

我的实体“签名”已由automapper映射(不要与Automapper库混淆!),我想更改某些列的db类型。

如果我做这样的事情:试图执行插入到表时

public class SignatureMap : IAutoMappingOverride<Signature> 
{ 
    public void Override(AutoMapping<Signature> mapping) 
    { 
     mapping.Map(x => x.SignType).CustomSqlType("character varying"); 
     mapping.Map(x => x.Status).CustomSqlType("integer").Nullable(); 
    } 
} 

我得到NHibernate的错误与NpgsqlParameterCollection(索引超出范围)。

这可能是因为mapping.Map函数只是向集合添加另一个映射,而不是覆盖已存在的映射(我检查了FluentNHibernate源代码)。

什么是使用IAutoMappingOverride重写Sql类型的正确方法?

回答

1

有什么不对您使用替代语法,请确保您:
1)实际引用您的overrided映射在配置:.UseOverridesFromAssemblyOf<SignatureMap>();
2)验证NHibernate的对待你的DB模式如您所愿。你可以使用像new SchemaExport(config).Create(true, false);这样的东西,这会输出sql到控制台。

如果1和2都可以,那么问题可能出现在您的插入代码中。