流利的 nHibernate 动态属性名称

本文关键字:属性 动态 nHibernate | 更新日期: 2023-09-27 17:57:15

我想让这个映射工作:

    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 无效,计数 = N 错误

我在这里找到了问题的答案: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 中映射到"First_ID"而不明确指定列的名称?

附言我试过使用

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

它不起作用。

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

流利的 nHibernate 动态属性名称

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

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"。这样,它们将通过条件和 HQL 可供您使用,但实际上不需要存在于您的实体中。