1

我正在试验 Fluent Nhibernate 的自动映射功能。

我看到了一个具有默认字符串约定的示例,如下所示

namespace Vuscode.Framework.NHibernate.Conventions
{
    using FluentNHibernate.Conventions;
    using FluentNHibernate.Conventions.Instances;

    public class DefaultStringPropertyConvention : IPropertyConvention
    {
        public void Apply(IPropertyInstance instance)
        {
            instance.Length(100);
            instance.Nullable();
        }
    }
}

在这里,我看不到任何检查是否instance为字符串类型的东西。它只是使长度为 100 并且可以为空。Automapper 如何知道仅将此约定应用于字符串?

此外,我想让我的所有布尔值都不可为空,并将默认值设置为 0.. 所以按照上面的例子,我会有这个:

namespace Vuscode.Framework.NHibernate.Conventions
{
    using FluentNHibernate.Conventions;
    using FluentNHibernate.Conventions.Instances;

    public class DefaultBoolPropertyConvention : IPropertyConvention
    {
        public void Apply(IPropertyInstance instance)
        {
            instance.Not.Nullable();
            instance.Default("0");
        }
    }
}

但是如果我这样做并且在我的项目中也有默认字符串约定..那么自动映射器如何知道约定适用于哪些属性类型?

我尝试阅读有关约定的流利维基,但没有发现任何有用的东西。

4

1 回答 1

1

stringconvention 应用于所有属性,但由于 NHibernate 忽略了非字符串属性的长度,并且可为 null 是默认值,它只是没有效果。您有两个选项来过滤非布尔属性

public void Apply(IPropertyInstance instance)
{
    if (instance.Type == typeof(bool))
    {
        instance.Not.Nullable();
        instance.Default("0");
    }
}

// or

public class DefaultBoolPropertyConvention : IPropertyConvention, IPropertyConventionAcceptance
{
    public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria)
    {
        criteria.Expect(i => i.Type == typeof(bool));
    }

    public void Apply(IPropertyInstance instance)
    {
        instance.Not.Nullable();
        instance.Default("0");

    }
}
于 2012-10-05T10:12:13.100 回答