3

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

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

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

让我试着解释得更好。

数据库:在此处输入图像描述

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 而不必找出另一种处理本地化的方法。

4

1 回答 1

2

将属性标记为不可更新。

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

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

class TranslatedPropertiesConvention : AttributePropertyConvention<Translated>
{
    public void Apply(FluentNHibernate.Conventions.Instances.IPropertyInstance instance)
    {
        instance.Not.Update();
    }
}
于 2013-01-07T09:42:35.453 回答