在Fluent NHibernate中将URI映射到字符串

时间:2009-12-19 18:18:03

标签: c# .net nhibernate orm fluent-nhibernate

(请参阅related question了解LINQ-to-SQL)

我想使用NHibernate将具有URI成员的类映射到string列。 我到底能做到这一点?

我不认为给出相关问题的解决方案在这里工作 - 我不能声明私有字段并映射它,因为映射需要引用该字段。

2 个答案:

答案 0 :(得分:8)

除非你需要做一些特殊的事情,否则NHibernate提供的UriType会起作用(我不知道它引入了什么版本 - 我使用的是3.1.4000)。无需编写自定义用户类型。

类映射

您可以在UriType中指定ClassMap<>

public class ImportedWebImageMap : ClassMap<ImportedWebImage>
{
    public ImportedWebImageMap()
    {
        Id(x => x.Id);
        Map(x => x.SourceUri).CustomType<UriType>();
    }
}

财产公约

您可以使用属性约定映射所有Uri属性以使用UriType

public class UriConvention : IPropertyConvention
{
    public void Apply(IPropertyInstance instance)
    {
        if (typeof(Uri).IsAssignableFrom(instance.Property.PropertyType))
            instance.CustomType<UriType>();
    }
}

存储为varchar

如果要将Uri作为varchar而不是默认nvarchar存储在数据库中,则可以创建派生自UriType的自定义类型并指定{ {1}} SQL类型:

AnsiString

答案 1 :(得分:3)

同样的解决方案可以正常工作;您可以将字符串属性定义为私有,因此不会向任何人公开。

Fluent NHibernate不像标准HBM文件那样容易处理,但可以通过几种方式完成。有关说明,请参阅Fluent NHibernate Wiki

或者,我认为你必须定义一个IUserType类,它可以将值加载/保存为字符串。可以在at the end of this blog post找到使用Fluent NHibernate执行此操作的示例。