流畅的nHibernate动态属性名称

时间:2011-05-19 14:12:58

标签: c# .net nhibernate fluent-nhibernate

我想让这个映射工作:

    Map(x => x.First, "First_ID");
    Map(x => x.Second, "Second_ID")

    References(x => x.SomeProperty)
        .Access.AsCamelCaseField(Prefix.Underscore)
        .Nullable()
        .NotFound.Ignore()
        .WithColumns("First_ID", "Second_ID")
        .LazyLoad();

当我想将实体插入数据库时​​,它不起作用。它说: 此SqlParameterCollection的索引N无效,且Count = N error

我在这里找到了一个问题的答案: http://devlicio.us/blogs/derik_whittaker/archive/2009/03/19/nhibernate-and-invalid-index-n-for-this-sqlparametercollection-with-count-n-error.aspx

但答案是说我需要删除下面的代码才能使插入工作

  Map(x => x.First, "First_ID");
  Map(x => x.Second, "Second_ID")

问题是我无法删除映射因为这样我的实体无法从数据库中获取。它说不能找到表中的第一列和第二列。 我明白为什么会发生这种情况,但有没有办法在不删除映射的情况下解决问题? 只是为了改变这段代码中的内容:

References(x => x.SomeProperty)
        .Access.AsCamelCaseField(Prefix.Underscore)
        .Nullable()
        .NotFound.Ignore()
        .WithColumns("First_ID", "Second_ID")
        .LazyLoad();

例如,不要为列名使用文字,但是一些“知道”在这个映射属性中的代码首先映射到“First_ID”而没有明确指定列的名称?

P.S。我试过用

References(x => x.SomeProperty)
        .Access.AsCamelCaseField(Prefix.Underscore)
        .Nullable()
        .NotFound.Ignore()
        .WithColumns(x => x.First, x => x.Second)
        .LazyLoad();

它不起作用。

删除映射的另一个解决方案是更改从db获取实体的查询,但在这种情况下我需要添加额外的连接 - 这是愚蠢的因为我在我自己的表中有列,为什么我需要进行连接然后在我不完全需要此连接时添加一些限制。

1 个答案:

答案 0 :(得分:2)

您可以通过执行以下操作指定不应更新属性:

Map(x => x.First, "First_ID").Not.Update();
Map(x => x.Second, "Second_ID").Not.Update();

或者,如果您想拥有这些属性的唯一原因是在查询中使用它们。您可以 要么

Map(x => x.First, "First_ID").Access.None();
Map(x => x.Second, "Second_ID").Access.None();

或者更简单地删除这些属性并使用旧的时尚hbm文件来映射您的实体并为您的属性指定access="none"。这样,它们将通过Criteria和HQL提供给您,但实际上并不需要存在于您的实体中。