【问题标题】:How can I ignore properties of a component using Fluent Nhibernate's AutoPersistenceModel?如何使用 Fluent Nhibernate 的 AutoPersistenceModel 忽略组件的属性?
【发布时间】:2010-04-20 16:07:08
【问题描述】:

我正在使用 Fluent NHibernate AutoMappings 来映射我的实体,包括一些组件对象。 其中一个组件对象包含如下属性:

public string Value 
{ 
  set _value = value; 
}

这会导致 NHibernate.PropertyNotFoundException: "Could not find a getter for property 'Value'..."

我想忽略这个属性。

我尝试为组件类创建 IAutoMappingOverride,但出于同样的原因,我无法使用 AutoMapping.IgnoreProperty(x => x.Value)。 "属性或索引器 'MyComponent.Value' 不能在此上下文中使用,因为它缺少 get 访问器"

我还查看了 IComponentConvention,但看不到使用此约定更改映射。

任何帮助将不胜感激......

谢谢

【问题讨论】:

    标签: fluent-nhibernate


    【解决方案1】:

    你可以使用:

    Reveal.Member<Owner, object> ("Value")`.
    

    例如

    mapping.IgnoreProperty(Reveal.Member<Owner, object> ("Value")
    

    Reveal.Member 可以在 Fluent NHibernate 需要表达式的任何地方使用。这可用于公开私有/受保护的属性和字段。

    【讨论】:

    • 感谢克里斯的提示。幸运的是,模型已经进化了,所以我不再需要只写属性了。有机会我会测试你的答案。
    • 谢谢克里斯,效果很好。不过有几点: 1 - IgnoreProperty 期望 Reveal.Member("Value") - 不是字符串; 2 - 它仍然需要属性上的私有 get 访问器。
    • 在将 FluentNHibernate 更新到 v1.3 后,不幸的是,这不再有效 - 映射未被忽略并生成以下错误:NHibernate.InvalidProxyTypeException:以下类型可能无法用作代理:方法 get_Value应该是“公共/受保护的虚拟”或“受保护的内部虚拟”
    【解决方案2】:

    您可以在映射文件中使用 OverrideAll()。如果您不知道它将成为成员的类型,那么您需要使用此版本将成员指定为字符串。这是来自Fluent Nhibernate Wiki 的示例。

    .OverrideAll(map =>  
    {  
      map.IgnoreProperty("YourProperty");
    });
    

    【讨论】:

      【解决方案3】:

      如果您将私有 Get 方法添加到您的属性,您可能能够使覆盖工作。

      【讨论】:

        【解决方案4】:

        我尝试了私有和受保护的 get 访问器,但除非访问器是公共的,否则覆盖不会编译。

        “属性或索引器无法在此上下文中使用,因为它缺少 get 访问器”

        【讨论】:

        • 其他人在私有后备变量和 FNH 方面遇到了麻烦——除非我真的非常需要它们,否则我不会使用它们。我建议您尝试将属性声明为“public virtual string Value { get; set; }”以使覆盖工作,然后尝试将“get”设为私有(我知道您可以将“set”设为私有,但是不确定“get”)。
        【解决方案5】:

        您可以添加公共 getter throwing NotSupportedException 以使编译器满意:

        public virtual string Value 
        { 
            get { throw new NotSupportedException(); }
            set { _value = value; }
        }
        

        【讨论】:

        • 不幸的是,这似乎是最好的选择。
        • Chris Chilvers 回答,使用 Reveal.Member("PropertyName") 忽略该属性,给出了所需的结果。不再有不必​​要的 NotSupportedException!
        • Reveal 对 IntelliSense 不友好
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-02
        • 1970-01-01
        • 2013-05-20
        • 1970-01-01
        相关资源
        最近更新 更多