.net Nhibernate更新问题-参数索引超出范围
我在将数据更新到数据库时遇到问题。我有一个简单的多对一产品组关系:.net Nhibernate更新问题-参数索引超出范围,.net,nhibernate,c#-4.0,fluent-nhibernate,.net,Nhibernate,C# 4.0,Fluent Nhibernate,我在将数据更新到数据库时遇到问题。我有一个简单的多对一产品组关系: public class GroupInfoMapping : ClassMap<GroupInfo> { public GroupInfoMapping() { Table("`group`"); Schema("tempdb"); Id(x => x.Id) .GeneratedBy.Native();
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();
}
}
公共类GroupInfoMapping:ClassMap
{
公共GroupInfoMapping()
{
表(“`组'”);
模式(“tempdb”);
Id(x=>x.Id)
.GeneratedBy.Native();
OptimisticLock.Version();
Map(x=>x.GroupName);
Map(x=>x.ParentId);
有很多(x=>x.Products)
.KeyColumn(“GroupId”)
.Inverse()
.Fetch.Select()
.AsSet();
//有很多(x=>x个孩子)
//.KeyColumn(“Id”)
//.Inverse()
//.Fetch.Select()
//.Cascade.None()
//.AsSet();
//引用(x=>x.Parent)
//.类别(类别(组信息))
//.列(“父ID”)
//.Fetch.Select();
}
}
公共类ProductInfoMapping:ClassMap
{
公共产品信息映射()
{
表(“`产品'”);
模式(“tempdb”);
Id(x=>x.Id)
.GeneratedBy.Native();
OptimisticLock.Version();
Map(x=>x.GroupId);
地图(x=>x.ProductName);
引用(x=>x.Group)
.类别(类别(组信息))
.列(“组ID”)
.Fetch.Select();
}
}
如果我只更改产品数据,则没有区别,它将不允许我更新,例外情况如下:
参数索引超出范围
若我将Not.Update()添加到产品映射以供组引用,则我可以更新产品数据(但组仍然未被引用)
我使用MySql数据库,每个演示者使用一个会话。为什么我不能同时更新实体及其引用?我已经注释掉了自引用组的部分,因为这在仅更新组时也会产生问题
谢谢,
Goran在ProductInfoMapping类中,您要映射同一列两次:
Map(x => x.GroupId);
及
不需要组id的映射,因为您可以在不使用该映射的情况下访问组属性的id:
var groupId = someProdInfoObj.Group.Id;
更新:
如果您仍然希望有一个GroupId属性,您可以访问组的id,而不是直接在组对象上访问它,您可以这样修改该属性(例如Guid类型的id):
实际抛出的代码是什么?当我在映射中两次使用同一列时,经常会出现这种错误。谢谢,这就是问题所在。此代码由VisualNHibernate生成,在一对多映射中使用选项“包含外键列”。不需要访问引用实体本身就拥有此属性的正确方法是什么?谢谢,这就是问题所在。此代码由VisualNHibernate生成,在一对多映射中使用选项“包含外键列”。在不需要访问引用实体本身的情况下,使用此属性的正确方法是什么?@Goran我已更新了答案,以包括在GroupInfo对象上使用GroupId属性的方法。我已经尝试过这种方法,但我的问题是无法在GroupId和Group之间同步。在您的代码中,实际上是将此属性设置为只读,因此设置就足够了。我需要GroupId是读写的,这样我就可以从数据绑定同步中获益。如果可能的话,我想知道怎么做。如果不可能,那么为什么VisualNHibernate提供此选项(包括外键列)?我发现它非常有用(EF也有),特别是在linq查询中。如果我将其设置为只读(如您的示例中所示),linq和数据绑定可以工作,但我需要updateble引用。@Goran看起来Visual NHibernate在默认情况下总是为外键生成属性,并将其设置为可选,正如所示。不幸的是,Visual NHibernate只是一个映射基因NHibernate的运算符,并将同一列映射两次(其中该列有可能被写入两次)不允许。我猜NHibernate不会跟踪对列的更改,而是对属性/字段的更改,而且它不会知道您是否更改了GroupId,它应该更改引用组以匹配。谢谢,我想我需要找到一种方法。
var groupId = someProdInfoObj.Group.Id;
public virtual Guid? GroupId
{
get { return Group != null ? Group.Id : null; }
set { }
}