【问题标题】:NHibernate fluent Prevent children being updatedNHibernate fluent 防止孩子被更新
【发布时间】:2012-11-30 03:27:16
【问题描述】:

我的应用程序使用本地化。它的构建方式是检查实体(遍历结构)并翻译每个标记为“翻译”的属性。

翻译存储在单独的翻译表中。

这一切都很好,但它给我留下了一个问题,当我使用翻译更新实体时,我现在在我的“默认”值中获取翻译值。而且我不希望那样。

让我试着解释得更好。

数据库:

footprintlinevLue的映射:

public class FootprintLineValueMap : ClassMap<FootprintLineValue> {
 public FootprintLineValueMap() {
    Table("FootprintLineValue");

    Id(x => x.Id).GeneratedBy.Identity().Column("Id");
    References(x => x.FootprintLine).Column("FootprintLineId");
    References(x => x.CategoryValue).Column("CategoryValueId").Cascade.None();

  }

正如您所见,足迹线有多个引用 categoryValue 的值。 categoryvalue 已本地化。

当我现在检索足迹线时,我们的框架会将其放入我们的翻译服务中,并自动将 CategoryValue 的名称和描述翻译成相应的文化。如果在 CategoryValueLocal 中找不到翻译,它将使用 CategoryValue 中的默认值。

但是...如果我保存足迹线,它会将翻译后的值保存回 CategoryValue(覆盖默认值)而不是忽略它。

CategoryValues 不是值对象,可以更改,因此我不能将它们设为只读。 我尝试将引用映射为 Cascade.None,但这似乎没有任何作用。

我希望有一种方法可以在映射中简单地标记它,这样我们就可以继续使用我们的 TranslationService 而不必想出另一种处理本地化的方法。

【问题讨论】:

    标签: fluent-nhibernate mapping cascade


    【解决方案1】:

    将属性标记为不可更新。

    Map(x => x.Description).Not.Update();
    

    你甚至可以定义一个约定来这样做

    class TranslatedPropertiesConvention : AttributePropertyConvention<Translated>
    {
        public void Apply(FluentNHibernate.Conventions.Instances.IPropertyInstance instance)
        {
            instance.Not.Update();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2010-11-05
      • 2010-10-09
      • 1970-01-01
      • 2016-07-26
      • 1970-01-01
      • 2011-11-10
      • 1970-01-01
      • 1970-01-01
      • 2012-06-05
      相关资源
      最近更新 更多