我的应用程序使用本地化。它的构建方式是检查实体(向下遍历结构)并翻译标记为“翻译”的每个属性。
翻译存储在单独的翻译表中。
这一切都很好,但它留给我的问题是,当我使用翻译更新实体时,我现在在我的“默认”值中获得翻译值。我不想这样。
让我试着解释得更好。
数据库:
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();
}
如您所见,足迹线具有多个引用类别值的值。类别值已本地化。
当我现在检索足迹线时,我们的框架将通过我们的翻译服务将其放入并自动翻译相应文化中类别值的名称和描述。如果在 CategoryValueLocal 中找不到翻译,它将使用 CategoryValue 中的默认值。
但是...如果我保存足迹线,它会将翻译后的值保存回 CategoryValue(覆盖默认值)而不是忽略它。
CategoryValues 不是值对象,可以更改,所以我不能将它们设置为只读。 我尝试将引用映射为 Cascade.None,但这似乎没有任何作用。
我希望有一种方法可以在映射中简单地标记它,这样我们就可以继续使用我们的 TranslationService,而不必想出另一种方法来处理本地化。
最佳答案
将属性标记为不可更新。
Map(x => x.Description).Not.Update();
你甚至可以定义一个约定来这样做
class TranslatedPropertiesConvention : AttributePropertyConvention<Translated>
{
public void Apply(FluentNHibernate.Conventions.Instances.IPropertyInstance instance)
{
instance.Not.Update();
}
}
关于fluent-nhibernate - NHibernate fluent 防止 child 被更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13839535/