我正在使用 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>();
});
}
}
由于
答案 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 });
我会尝试找出更好的解决方案并在此处发布。