Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net Nhibernate更新问题-参数索引超出范围_.net_Nhibernate_C# 4.0_Fluent Nhibernate - Fatal编程技术网

.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 { }
}