NHibernate流利防止孩子们更新

时间:2012-12-12 12:12:45

标签: fluent-nhibernate mapping cascade

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

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

这一切都很好,但是当我使用翻译更新实体时,我现在得到了我的'默认'值中的翻译值的问题。我不希望这样。

让我试着更好地解释一下。

数据库:enter image description here

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,而不必想出另一种方法来进行本地化。

1 个答案:

答案 0 :(得分:2)

将属性标记为不可更新。

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

你甚至可以定义一个约定

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