Nhibernate更新问题-参数索引超出范围



我有更新数据到数据库的问题。我有一个简单的多对一Product - Group关系:

    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()添加到Product Mapping以供Group引用,我就能够更新产品数据(但是Group仍然未被引用)。

我正在使用MySql数据库,我使用每个演示者一个会话。为什么我不能同时更新实体和它的引用?我已经注释掉了自引用组的部分,因为这也会在仅更新组时产生问题。

谢谢,Goran

在您的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 { }
}

最新更新