2

对于我正在处理的项目,我使用自定义类型将数据库中的 IP 地址作为二进制和地址系列对来处理。

如果我尝试在 SubclassMap 中映射到我的自定义类型,它会在启动期间失败并出现映射异常

NHibernate.MappingException:属性映射的列数错误:AddressAsset.Address 类型:IPAddressBinaryUserType

失败的映射代码如下:

public class AbstractAssetMap : ClassMap<AbstractAsset>
{        
    public AbstractFirewallAssetMap()
    {
        Table("asset");
        Id(x => x.FirewallAssetSk).Column("asset_sk").GeneratedBy.Native();
        DiscriminateSubClassesOnColumn<string>("type");
        // ... other property mappings

    }
}

public class AddressAssetMap : SubclassMap<AddressAsset>
{
    public AddressAssetMap()
    {
        DiscriminatorValue(AbstractFirewallAsset.FirewallAssetType.Address);
        Map(x => x.Address)
            .CustomType<IPAddressBinaryUserType>()
            .Columns.Add("address_family", "address");
    }
}

// ... other SubclassMaps of AbstractAsset subclasses

如果我删除其中一列,则不再抛出 MappingException。然而,这不是一个解决方案,因为我需要来自两列的数据。

同样,如果我删除子类并使用相同的自定义类型显式映射子类,它似乎可以工作,并且在映射期间不会失败。例如:

public class AddressAssetMap : ClassMap<AddressAsset>
{        
    public AddressAssetMap()
    {
        Table("asset");
        Id(x => x.FirewallAssetSk).Column("asset_sk").GeneratedBy.Native();
        Map(x => x.Address)
            .CustomType<IPAddressBinaryUserType>()
            .Columns.Add("address_family", "address");
        // ... other property mappings

    }
}

在流畅的 NHibernate SubclassMap 中映射多列用户类型的正确方法是什么?

4

1 回答 1

3

您应该尝试升级 fluent nhibernate。请查看已知问题https://github.com/jagregory/fluent-nhibernate/issues/210

于 2015-02-16T15:04:04.760 回答