流利的NHibernate-用NEW List <object>子代保存新的父对象

时间:2019-11-23 18:53:25

标签: nhibernate orm fluent-nhibernate nhibernate-mapping

我创建了“父母”对象。父对象包含“子代”对象的列表。

当我保存父对象时,我希望子对象也被保存,但是只有父对象被保存到数据库中。

FluentNHibernate版本为1.2.0.712

NHibernate版本是3.1.0.4000

我的映射和模型如下。

父级模型

namespace Models 
{  
    public class OpenSale 
    {
        public OpenSale() 
        {
            OpenSaleItems = new List<OpenSaleItem>();
        }

    public virtual int ID { get; set; }

    public virtual int StaffID { get; set; }
    public virtual int TillID { get; set; }
    public virtual int? FloorTableID { get; set; }
    public virtual int LocationID { get; set; }
    public virtual System.DateTime TimeStarted { get; set; }
    public virtual System.Nullable<System.DateTime> TimeCompleted { get; set; }
    public virtual int? TenderTypeID { get; set; }
    public virtual decimal Amount { get; set; }
    public virtual decimal AmountPaid { get; set; }
    public virtual char SaleCompleted { get; set; }
    public virtual char CompletedOffline { get; set; }
    public virtual string Surname { get; set; }
    public virtual decimal TotalVAT { get; set; }

    public virtual IList<OpenSaleItem> OpenSaleItems { get; set; }
}

}

父地图

    using FluentNHibernate.Mapping;
    using Models;

    namespace Maps
    {
      public class OpenSaleMap : ClassMap<OpenSale>
      {
        public OpenSaleMap()
        {
        Table("OpenSale");

        Id(x => x.ID).GeneratedBy.Identity().Column("ID");

        Map(x => x.TimeStarted).Column("TimeStarted").Not.Nullable();
        Map(x => x.TimeCompleted).Column("TimeCompleted");
        Map(x => x.TenderTypeID).Column("TenderTypeID").Nullable();
        Map(x => x.Surname).Column("Surname").Length(30);
        Map(x => x.Amount).Column("Amount").Not.Nullable();
        Map(x => x.AmountPaid).Column("AmountPaid").Not.Nullable();
        Map(x => x.SaleCompleted).Column("SaleCompleted").Not.Nullable().Length(1);
        Map(x => x.CompletedOffline).Column("CompletedOffline").Not.Nullable().Length(1);
        Map(x => x.TotalVAT).Column("TotalVAT").Not.Nullable();
        Map(x => x.StaffID).Column("StaffID");
        Map(x => x.TillID).Column("TillID");
        Map(x => x.FloorTableID).Column("FloorTableID");
        Map(x => x.LocationID).Column("LocationID");

        // WORKS BUT SAVES OPENSALE ONLY
        // HasMany(x => x.OpenSaleItems).KeyColumn("OpenSaleID").Inverse();
        // HasMany(x => x.OpenSaleItems).Cascade.All().KeyColumn("OpenSaleID").Inverse();
        // HasMany(x => x.OpenSaleItems).KeyColumn("OpenSaleID").Inverse();
        // HasMany(x => x.OpenSaleItems).KeyColumn("OpenSaleID");
        // HasMany(x => x.OpenSaleItems).Cascade.AllDeleteOrphan().Table("OpenSaleItem").LazyLoad().KeyColumn("OpenSaleID");


        //HasMany(x => x.OpenSaleItems).Cascade.All().KeyColumn("OpenSaleID");
        // HasMany(x => x.OpenSaleItems).Cascade.SaveUpdate().KeyColumn("OpenSaleID");
        //HasMany(x => x.OpenSaleItems).Inverse().KeyColumn("OpenSaleID");
        // HasMany(x => x.OpenSaleItems).Cascade.All().Table("OpenSaleItem").LazyLoad();
        // HasMany(x => x.OpenSaleItems).Cascade.SaveUpdate().Table("OpenSaleItem");

        //HasMany(x => x.OpenSaleItems).Cascade.All().Table("OpenSaleItem");
        //HasMany(x => x.OpenSaleItems).Table("OpenSaleItem");

        HasMany(x => x.OpenSaleItems)
   .Cascade.All()
   .KeyColumn("OpenSaleID")
   .Inverse() // this is the way how to manage insertions
   .Not
   .LazyLoad();

    }
}

}

子模型

using System.Collections.Generic; 
using System.Text; 
using System; 

namespace Models 
{ 
  public class OpenSaleItem 
  {
    public OpenSaleItem() 
    {
    }

    public virtual int ID { get; set; }
    public virtual int OpenSaleID { get; set; }
    public virtual int? StockPLU { get; set; }
    public virtual int? RecipeProductID { get; set; }
    public virtual int? SalesUnitID { get; set; }
    public virtual int PriceLevelID { get; set; }
    public virtual int QtyToBePaid { get; set; }
    public virtual int Quantity { get; set; }
    public virtual decimal SalesUnitCostPrice { get; set; }
    public virtual decimal TotalAmount { get; set; }
    public virtual decimal TotalVAT { get; set; }
    public virtual decimal TotalVolume { get; set; }
    public virtual char IsSubSalesUnit { get; set; }

    public virtual OpenSale OpenSale { get; set; }
  }
}

子地图

using FluentNHibernate.Mapping;
using Models;

namespace Maps 
{       
  public class OpenSaleItemMap : ClassMap<OpenSaleItem> 
  {    
    public OpenSaleItemMap() 
    {
        Table("OpenSaleItem");

        Id(x => x.ID).GeneratedBy.Identity().Column("ID");

        Map(x => x.Quantity).Column("Quantity").Not.Nullable();
        Map(x => x.SalesUnitCostPrice).Column("SalesUnitCostPrice").Not.Nullable();
        Map(x => x.OpenSaleID).Column("OpenSaleID").Generated.Insert();
        Map(x => x.StockPLU).Column("StockPLU").Nullable();
        Map(x => x.RecipeProductID).Column("RecipeProductID").Nullable();
        Map(x => x.PriceLevelID).Column("PriceLevelID").Not.Nullable();
        Map(x => x.QtyToBePaid).Column("QtyToBePaid").Not.Nullable();
        Map(x => x.SalesUnitID).Column("SalesUnitID").Nullable();
        Map(x => x.TotalAmount).Column("TotalAmount");
        Map(x => x.TotalVAT).Column("TotalVAT");
        Map(x => x.TotalVolume).Column("TotalVolume");
        Map(x => x.IsSubSalesUnit).Column("IsSubSalesUnit");

        References(x => x.OpenSale).Column("OpenSaleID");
    }
  }
}

您会注意到在父映射中有很多注释掉的代码行,它们是我尝试的映射,但是只有父记录被保存了。

我的目标是使用多个子对象创建父对象并将其保存在一个动作中。

有解决方法-但是可能涉及多次数据库访问或创建存储过程,并将子项列表作为数据表传递,但我宁愿选择一个框架并使用流利的NH。

任何帮助表示赞赏!谢谢

1 个答案:

答案 0 :(得分:0)

由于您正在使用Inverse(),因此在客户端也要建立关系很重要。您分配了OpenSaleItem.OpenSale吗?

如果这不能解决问题,请进行更新以显示尝试执行创建的实际代码,包括会话和事务管理。

相关问题