FluentNHibernate 棘手的映射
当我加载数据时,所有内容都已正确映射和加载,但是当我尝试使用 Period
、PaymentType
和 CalendarEntry
插入对象图时,它会引发异常:
{"Cannot insert the value NULL into column 'PaymentTypeId', table 'CashFlowCalculator.dbo.CalendarEntries'; column does not allow nulls. INSERT fails.\r\nThe statement has been terminated."}
原因是尝试插入的对象的外键列没有值。我不知道我的映射错误在哪里?
对象
public class Period
{
public virtual int Id { get; private set; }
public virtual DateTime StartDate { get; set; }
public virtual DateTime EndDate { get; set; }
public virtual double OpeningCash { get; set; }
public virtual IList<CalendarEntry> CalendarEntries { get; set; }
public Period()
{
CalendarEntries = new List<CalendarEntry>();
}
}
public class PaymentType
{
public virtual int Id { get; private set; }
public virtual string Name { get; set; }
public virtual string Description { get; set; }
public virtual DateTime StartDate { get; set; }
public virtual DateTime EndDate { get; set; }
public virtual bool IsIncome { get; set; }
public virtual IList<CalendarEntry> CalendarEntries { get; set; }
public PaymentType()
{
CalendarEntries = new List<CalendarEntry>();
}
}
public class CalendarEntry
{
public virtual int Id { get; private set; }
public virtual double Amount { get; set; }
public virtual DateTime DueDate { get; set; }
public virtual PaymentType PaymentType { get; set; }
public virtual Period Period { get; set; }
public CalendarEntry(){ }
public virtual void AddPaymentType(PaymentType paymentType)
{
paymentType.CalendarEntries.Add(this);
PaymentType = paymentType;
}
public virtual void AddPeriod(Period period)
{
period.CalendarEntries.Add(this);
Period = period;
}
}
映射
public PeriodMap()
{
Table("Periods");
Id(x => x.Id);
Map(x => x.OpeningCash);
Map(x => x.StartDate);
Map(x => x.EndDate);
HasMany(x => x.CalendarEntries).LazyLoad().Inverse().Cascade.All();
}
public PaymentTypeMap()
{
Table("PaymentTypes");
Id(x => x.Id);
Map(x => x.Name);
Map(x => x.Description);
Map(x => x.StartDate);
Map(x => x.EndDate);
Map(x => x.IsIncome);
HasMany(x => x.CalendarEntries).LazyLoad().Inverse().Cascade.All();
}
public CalendarEntryMap()
{
Table("CalendarEntries");
Id(x => x.Id);
Map(x => x.Amount);
Map(x => x.DueDate);
References(x => x.PaymentType).Column("PaymentTypeId");
References(x => x.Period).Column("PeriodId");
}
When I load data everything is mapped and loaded correctly, but when I try to insert object graph with Period
, PaymentType
and CalendarEntry
it throws an exception:
{"Cannot insert the value NULL into column 'PaymentTypeId', table 'CashFlowCalculator.dbo.CalendarEntries'; column does not allow nulls. INSERT fails.\r\nThe statement has been terminated."}
The reason is that there is no value for the foreign key column of the object that tries to insert. I can't where is the mistake in my mappings?
Objects
public class Period
{
public virtual int Id { get; private set; }
public virtual DateTime StartDate { get; set; }
public virtual DateTime EndDate { get; set; }
public virtual double OpeningCash { get; set; }
public virtual IList<CalendarEntry> CalendarEntries { get; set; }
public Period()
{
CalendarEntries = new List<CalendarEntry>();
}
}
public class PaymentType
{
public virtual int Id { get; private set; }
public virtual string Name { get; set; }
public virtual string Description { get; set; }
public virtual DateTime StartDate { get; set; }
public virtual DateTime EndDate { get; set; }
public virtual bool IsIncome { get; set; }
public virtual IList<CalendarEntry> CalendarEntries { get; set; }
public PaymentType()
{
CalendarEntries = new List<CalendarEntry>();
}
}
public class CalendarEntry
{
public virtual int Id { get; private set; }
public virtual double Amount { get; set; }
public virtual DateTime DueDate { get; set; }
public virtual PaymentType PaymentType { get; set; }
public virtual Period Period { get; set; }
public CalendarEntry(){ }
public virtual void AddPaymentType(PaymentType paymentType)
{
paymentType.CalendarEntries.Add(this);
PaymentType = paymentType;
}
public virtual void AddPeriod(Period period)
{
period.CalendarEntries.Add(this);
Period = period;
}
}
Mappings
public PeriodMap()
{
Table("Periods");
Id(x => x.Id);
Map(x => x.OpeningCash);
Map(x => x.StartDate);
Map(x => x.EndDate);
HasMany(x => x.CalendarEntries).LazyLoad().Inverse().Cascade.All();
}
public PaymentTypeMap()
{
Table("PaymentTypes");
Id(x => x.Id);
Map(x => x.Name);
Map(x => x.Description);
Map(x => x.StartDate);
Map(x => x.EndDate);
Map(x => x.IsIncome);
HasMany(x => x.CalendarEntries).LazyLoad().Inverse().Cascade.All();
}
public CalendarEntryMap()
{
Table("CalendarEntries");
Id(x => x.Id);
Map(x => x.Amount);
Map(x => x.DueDate);
References(x => x.PaymentType).Column("PaymentTypeId");
References(x => x.Period).Column("PeriodId");
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
如果您希望 CalendarEntry 映射上的 PaymentType 属性为“可为空”,我认为您必须指定它:
相反,如果您不希望它为空,则必须手动设置任何 CalendarEntry 实例的 PaymentType 属性。
If you want a "nullable" PaymentType property of your on your CalendarEntry mapping, I think you have to specify it:
Instead, if you don't want it nullable, you have to manually set the PaymentType property of any CalendarEntry instance.
这是我用来设置对象图的代码:
This is the code that I use to set the object graph: