流利的 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();
它不起作用。
删除映射的另一种解决方案是更改从数据库获取实体的查询,但在这种情况下,我需要添加额外的连接 - 这很愚蠢,因为我在自己的表中有列,为什么我需要进行连接,然后在我不完全需要此连接时添加一些限制。
您可以通过执行以下操作来指定属性不应更新:
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 可供您使用,但实际上不需要存在于您的实体中。