我在将数据更新到数据库时遇到问题。我有一个简单的多对一产品-组关系:
public class GroupInfoMapping : ClassMap<GroupInfo>
{
public GroupInfoMapping()
{
Table("`group`");
Schema("tempdb");
Id(x => x.Id)
.GeneratedBy.Native();
OptimisticLock.Version();
Map(x => x.GroupName);
Map(x => x.ParentId);
HasMany(x => x.Products)
.KeyColumn("GroupId")
.Inverse()
.Fetch.Select()
.AsSet();
//HasMany(x => x.Children)
// .KeyColumn("Id")
// .Inverse()
// .Fetch.Select()
// .Cascade.None()
// .AsSet();
//References(x => x.Parent)
// .Class(typeof(GroupInfo))
// .Column("ParentId")
// .Fetch.Select();
}
}
public class ProductInfoMapping : ClassMap<ProductInfo>
{
public ProductInfoMapping()
{
Table("`product`");
Schema("tempdb");
Id(x => x.Id)
.GeneratedBy.Native();
OptimisticLock.Version();
Map(x => x.GroupId);
Map(x => x.ProductName);
References(x => x.Group)
.Class(typeof(GroupInfo))
.Column("GroupId")
.Fetch.Select();
}
}
如果仅更改产品数据,则没有任何区别,它将不允许我进行以下异常更新:
参数索引超出范围。
如果我将Not.Update()添加到产品映射中以供组参考,则我可以更新产品数据(但组仍未被引用)。
我正在使用MySql数据库,并且每个演示者正在使用一个会话。为什么我不能同时更新实体及其参考?我已经注释掉了部分自引用组,因为这在仅更新组时也会产生问题。
谢谢,
戈兰
最佳答案
在ProductInfoMapping类中,您两次映射同一列:
Map(x => x.GroupId);
和
References(x => x.Group)
.Class(typeof(GroupInfo))
.Column("GroupId")
.Fetch.Select();
不需要组ID的Map,因为您无需使用该属性即可访问Group属性的ID:
var groupId = someProdInfoObj.Group.Id;
更新:
如果仍然希望有一个GroupId属性,可以访问Group的ID,而不是直接在Group对象上访问它,则可以像这样修改该属性(示例是具有Guid类型的ID):
public virtual Guid? GroupId
{
get { return Group != null ? Group.Id : null; }
set { }
}
关于.net - Nhibernate更新问题-参数索引超出范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7221847/