Fluent nhibernate Fluent NHibernate-无法将项添加到与持久化数据的HasMany关系中

Fluent nhibernate Fluent NHibernate-无法将项添加到与持久化数据的HasMany关系中,fluent-nhibernate,fluent-nhibernate-mapping,Fluent Nhibernate,Fluent Nhibernate Mapping,我有以下课程: public class Client { public virtual Guid ClientID { get; set; } public virtual string ClientName { get; set; } public virtual IList<ClientMonthlyRevenue> Revenue { get; set; } ... public virtual void SetMonthlyReve

我有以下课程:

public class Client {
    public virtual Guid ClientID { get; set; }
    public virtual string ClientName { get; set; }
    public virtual IList<ClientMonthlyRevenue> Revenue { get; set; }

    ...
    public virtual void SetMonthlyRevenue(int year, int month, double revenue)
    {   
        // Make sure it's not null... this might happen depending on how the client is created    
        if (Revenue == null)
        Revenue = new List<ClientMonthlyRevenue>();

        // Check for existance - we don't want any duplicates        
        ClientMonthlyRevenue clientMonthlyRevenue = Revenue.Where(x => x.Year == year && x.Month == month).FirstOrDefault();        
        if (clientMonthlyRevenue == null)        
        {
            // If it doesn't exist, create a new one and add to the list
            clientMonthlyRevenue = new ClientMonthlyRevenue(this, year, month, revenue);
            this.Revenue.Add(clientMonthlyRevenue);   // This is the line throwing the error
        }
        else
        {
            // If it exists, just update it
            clientMonthlyRevenue.Revenue = revenue;
        }
    }
}

public class ClientMonthlyRevenue {
    public virtual Client ParentClient { get; set; }
    public virtual int Year { get; set; }
    public virtual int Month { get; set; }
    public virtual double Revenue { get; set; }

    ...
}
我得到一个错误:

Collection was of a fixed size. 

我是不是遗漏了什么或者误解了什么?我需要修改什么才能将项目添加到此持久化列表中?

您是否尝试将您的集合标记为反向?我不知道这是否有帮助

HasMany<ClientMonthlyRevenue>(x => x.Revenue)
    .Table("ClientMonthlyRevenue")
    .KeyColumn("ClientID")
    .Cascade.All()
    .Fetch.Join()
    .Inverse();
HasMany(x=>x.Revenue)
.表格(“客户月平均值”)
.KeyColumn(“客户ID”)
.Cascade.All()
.Fetch.Join()
.Inverse();

我会将客户端对象更改为具有以下内容:

public class Client
{
    public Client()
    {
        Revenue = new List<ClientMonthlyRevenue>();
    }

    public virtual Guid ClientID { get; set; }
    public virtual string ClientName { get; set; }
    public virtual IList<ClientMonthlyRevenue> Revenue { get; set; }

    public virtual void AddRevenue(ClientMonthlyRevenue revenue)
    {
        revenue.ParentClient = this;
        Revenue.Add(revenue);
    }
}
公共类客户端
{
公共客户机()
{
收入=新列表();
}
公共虚拟Guid客户端ID{get;set;}
公共虚拟字符串ClientName{get;set;}
公共虚拟IList收入{get;set;}
公共虚拟void AddRevenue(客户每月平均收入)
{
revenue.ParentClient=这个;
收入。添加(收入);
}
}
然后你可以这样打电话:

public void TestMapping()
{
    session.BeginTransaction();
    var client = new Client{ClientID = Guid.NewGuid()};
    session.SaveOrUpdate(client);

    client = session.Get<Client>(client.ClientID);
    client.AddRevenue(new ClientMonthlyRevenue(2001,07,1200));
    session.Transaction.Commit();
}
public void TestMapping()
{
session.BeginTransaction();
var client=new client{ClientID=Guid.NewGuid()};
会话。保存或更新(客户端);
client=session.Get(client.ClientID);
客户增加收入(新客户月收入(2001,071200));
Commit();
}

您接收到的错误听起来可能是在堆栈的更高层创建的。我能重现你的情景。请参阅完整来源:

能否包含stacktrace?我能够创建一个样本,它对我来说很好?stacktrace非常无趣。。。它指向客户机类中指定的行(我添加了抛出错误的函数),下面是我的程序我希望客户机控制ClientMonthlyRevenue对象,这样我就不需要显式保存子对象。添加Inverse()只会更改控制保存的映射。通过调用Cascade.All(),您的clientmap仍在进行保存,但将保存操作推迟到revenuemap。这使得生成的sql有所不同。如果没有反转,您将看到一系列删除操作,然后是插入操作。使用inverse,您将看到一次插入操作。哇,我完全误解了inverse()的用途。。谢谢遗憾的是,这并没有解决问题。你是对的。经过一些挖掘,我发现这是由一些巫毒框架代码造成的,该代码自动序列化从几个类继承的对象-当列表被序列化时,它将其转换为静态大小的数组。
HasMany<ClientMonthlyRevenue>(x => x.Revenue)
    .Table("ClientMonthlyRevenue")
    .KeyColumn("ClientID")
    .Cascade.All()
    .Fetch.Join()
    .Inverse();
public class Client
{
    public Client()
    {
        Revenue = new List<ClientMonthlyRevenue>();
    }

    public virtual Guid ClientID { get; set; }
    public virtual string ClientName { get; set; }
    public virtual IList<ClientMonthlyRevenue> Revenue { get; set; }

    public virtual void AddRevenue(ClientMonthlyRevenue revenue)
    {
        revenue.ParentClient = this;
        Revenue.Add(revenue);
    }
}
public void TestMapping()
{
    session.BeginTransaction();
    var client = new Client{ClientID = Guid.NewGuid()};
    session.SaveOrUpdate(client);

    client = session.Get<Client>(client.ClientID);
    client.AddRevenue(new ClientMonthlyRevenue(2001,07,1200));
    session.Transaction.Commit();
}