我最近从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。
关于如何解决这个问题的任何指示?
答案 0 :(得分:1)
CustomerValue是否来自数据库,因为它是派生值?
如果它没有删除虚拟并在映射中将其排除。
答案 1 :(得分:1)
如果这是唯一的映射或少数几个中断之一,那么手动忽略它/使用no setter映射映射它。否则,请关闭映射不可写属性作为您列出的建议并映射任何异常。不确定你能做多少其他事情,除非自己分配代码并解决问题。
<强>更新强>
我刚刚运行了一个测试,PropertyInfo.CanWrite
为受保护和私有的setter返回true。所以我不确定你已经发布的解决方案确实存在问题。