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();
}