1

我正在使用NHibernate 3.3并使用按代码映射系统。我正在使用的表/数据库对于我的应用程序将是只读的。

我面临的问题是我的主键列在 SQL Server 中存储为二进制字段。我需要将其作为字符串读取,不幸的是我无法修改表(包括添加索引视图)。

此时,我正在尝试使用IUsertype将值从二进制转换为字符串。但是,在尝试将实体中的 Id 列的类型设置为使用 IUserType 时,我被卡住了。

我已经成功地为以下示例的普通属性执行此操作,但无法弄清楚如何为 ID 列和外键列执行此操作。

public class ExampleEntity
{
    public virtual String MyIdColumn { get; set; }
    public virtual Country Country { get; set; }
}


public class ExampleEntityMap : ClassMapping<ExampleEntity>
{

    public ExampleEntityMap()
    {
        Table("Table");

        Id(i => i.Id, map =>
        {
            map.Column("MyIdColumn");
            map.Type(???);
        });
        Property(i => i.Country, map =>
                                  {
                                      map.Column("Country");
                                      map.Type<CountryEnumUserType>();
                                  });
    }
}
  1. NH3.3 代码映射是否可行?
  2. 我必须实现IIdentifierType来实现 IUserType 对 Id 字段的作用吗?
  3. NHibernate 变压器可以实现我正在做的事情吗?
  4. 还有其他方法可以解决这个问题吗?除了检索数据并在 C# 中转换它,因为我必须对十几个表中的许多列执行此操作。

谢谢

4

2 回答 2

0

弄清楚了。我最终使用 ComposedId 属性来映射 Id 列,它允许您为 Id 列指定 IUserType。

public class ExampleEntityMap : ClassMapping<ExampleEntity>
{
    public ExampleEntityMap()
    {
        Table("Table");

        ComposedId(i => i.Property(p => p.MyIdColumn, map =>
                                                    {
                                                        map.Column("MyIdColumn");
                                                        map.Type<MyIdColumnUserType>();
                                                    }));

        Property(i => i.Country, map =>
                              {
                                  map.Column("Country");
                                  map.Type<CountryEnumUserType>();
                              });
    }
}
于 2013-09-28T00:53:36.573 回答
0

您提到的解决方案虽然有点破解。

为了使其工作,实体还需要覆盖 Equality / GetHashCode,如下所示:

    public override bool Equals(object obj)
    {
        return Country == (obj as ExampleEntity)?.Country;
    }

    public override int GetHashCode()
    {
        return this.Country.GetHashCode();
    }

并且在加载使用时Get需要使用:

session.Get(new ExampleEntity{ Country = Countries.Kenya });

我将尝试找出更好的解决方案并将其发布在这里。

于 2016-12-06T10:09:46.083 回答