当我加载数据时,所有内容都被正确映射和加载,但是当我尝试使用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");
}
答案 0 :(得分:1)
如果你想在CalendarEntry映射中使用“可为空”的PaymentType属性,我认为你必须指定它:
public CalendarEntryMap()
{
Table("CalendarEntries");
Id(x => x.Id);
Map(x => x.Amount);
Map(x => x.DueDate);
References(x => x.PaymentType).Column("PaymentTypeId").Nullable();
References(x => x.Period).Column("PeriodId");
}
相反,如果您不希望它可以为空,则必须手动设置任何CalendarEntry实例的PaymentType属性。
答案 1 :(得分:0)
这是我用来设置对象图的代码:
Period period = new Period
{
OpeningCash = 2000,
StartDate = new DateTime(2011, 1, 1),
EndDate = new DateTime(2011, 12, 1)
};
PaymentType type = new PaymentType
{
Description = "Description",
IsIncome = false,
Name = "Name",
StartDate = new DateTime(2010, 11, 23),
EndDate = new DateTime(2012, 11, 23)
};
CalendarEntry entry = new CalendarEntry
{
Amount = 232,
DueDate = new DateTime(2011, 7, 23)
};
entry.AddPeriod(period);
entry.AddPaymentType(type);