Fluent NHibernate映射用于只读属性

时间:2011-01-24 22:54:30

标签: c# nhibernate fluent-nhibernate fluent

我最近从1.0迁移到Fluent NHibernate 1.1,迁移有一些重大变化。

例如,域模型中的字段如

    public virtual string CustomerType
    {
        get { return /*computed value based on _Type which is a column in database */; }

    }

    public virtual string MemberType
    {
        get { return _Type; }
        set { _Type = value; }

    }

用于在没有指定任何配置/约定的情况下正常工作。现在它抛出一个错误,指出“找不到setter”。我看到一个解决方案,其中一个创建一个成员变量,如customerType或_customerType,或者放入受保护的setter。

请注意,CustomerType依赖于从数据库中检索到的另一个值。

我也看到了像http://support.fluentnhibernate.org/discussions/help/269-fluentnhibernate-11-automapper-doesnt-accept-read-only-properties-anymore这样的替代品 重写DefaultAutoMappingConfiguration,例如

   public override bool ShouldMap(Member member)
    {
        if (member.IsProperty && !member.CanWrite)
        {
            return false;
        }

        return base.ShouldMap(member);
    }

但这意味着在映射中完全跳过其他具有私有或受保护的setter的字段。

我正在寻找一个解决方案,当Fluent NHibernate未指定setter时,它不会查找setter,而是映射私有/受保护的setter。

关于如何解决这个问题的任何指示?

2 个答案:

答案 0 :(得分:1)

CustomerValue是否来自数据库,因为它是派生值?

如果它没有删除虚拟并在映射中将其排除。

答案 1 :(得分:1)

如果这是唯一的映射或少数几个中断之一,那么手动忽略它/使用no setter映射映射它。否则,请关闭映射不可写属性作为您列出的建议并映射任何异常。不确定你能做多少其他事情,除非自己分配代码并解决问题。

<强>更新 我刚刚运行了一个测试,PropertyInfo.CanWrite为受保护和私有的setter返回true。所以我不确定你已经发布的解决方案确实存在问题。