在NHibernate 3.3+ Mapping-By-Code中使用带有ID字段的IUsertype

时间:2013-09-26 06:22:13

标签: c# nhibernate fluent-nhibernate nhibernate-mapping mapping-by-code

我正在使用 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#中转换它之外,我必须为十几个表中的许多列执行此操作。
  5. 由于

2 个答案:

答案 0 :(得分: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>();
                              });
    }
}

答案 1 :(得分: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 });

我会尝试找出更好的解决方案并在此处发布。