【问题标题】:Fluent NHibernate mapping for read only properties只读属性的流畅 NHibernate 映射
【发布时间】:2011-01-24 22:54:30
【问题描述】:

我最近从 Fluent NHibernate 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; }

    }

过去可以在不指定任何配置/约定的情况下正常工作。现在它会抛出一个错误,指出“找不到设置器”。我看到的解决方案是创建一个成员变量,例如 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);
    }

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

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

关于如何进行此操作的任何指示?

【问题讨论】:

    标签: c# nhibernate fluent-nhibernate fluent


    【解决方案1】:

    如果这是唯一的映射或少数几个中断的映射之一,则手动忽略它/使用无设置器映射映射它。否则,按照您列出的建议关闭映射不可写属性并映射任何异常。除了自己分叉代码和解决问题之外,不确定您还能做很多其他事情。

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

    【讨论】:

      【解决方案2】:

      CustomerValue 是从数据库中出来的,因为它是派生值吗?

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

      【讨论】:

      • 是的。它是从数据库中的列派生的值。我也更新了问题。
      猜你喜欢
      • 1970-01-01
      • 2023-03-14
      • 2010-11-22
      • 2013-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-19
      相关资源
      最近更新 更多