FluentNHibernate棘手的映射

时间:2011-11-29 20:57:21

标签: fluent-nhibernate-mapping

当我加载数据时,所有内容都被正确映射和加载,但是当我尝试使用PeriodPaymentTypeCalendarEntry插入对象图时,它会引发异常:

{"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");
    }

2 个答案:

答案 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);