我想让这个映射工作:
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
但答案是说我需要删除下面的代码才能使插入工作
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获取实体的查询,但在这种情况下我需要添加额外的连接 - 这是愚蠢的因为我在我自己的表中有列,为什么我需要进行连接然后在我不完全需要此连接时添加一些限制。
答案 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提供给您,但实际上并不需要存在于您的实体中。