Fluent NHibernate-使用新列表保存新的父对象<;对象>;儿童

Fluent NHibernate-使用新列表保存新的父对象<;对象>;儿童,nhibernate,orm,fluent-nhibernate,nhibernate-mapping,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

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

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

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 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 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 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");
    }
  }
}
使用FluentNHibernate.Mapping;
使用模型;
名称空间映射
{       
公共类OpenSaleItemMap:ClassMap
{    
公共OpenSaleItemMap()
{
表(“公开销售项目”);
Id(x=>x.Id).GeneratedBy.Identity()列(“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();
映射(x=>x.TotalAmount)。列(“TotalAmount”);
映射(x=>x.TotalVAT).Column(“TotalVAT”);
映射(x=>x.TotalVolume).Column(“TotalVolume”);
映射(x=>x.IsSubSalesUnit)。列(“IsSubSalesUnit”);
参考文献(x=>x.OpenSale).Column(“OpenSaleID”);
}
}
}
您会注意到在父映射中有许多注释掉的代码行,它们是我尝试过的映射,但只保存了父记录

我的目标是使用多个子对象创建父对象,并在一个操作中保存

有一些变通方法,但需要多次访问数据库或创建存储过程,并将子项列表作为datatable传递,但我更愿意坚持使用一个框架并使用fluent NH


感谢您的帮助!谢谢

因为您使用的是Inverse(),所以在客户端设置关系也很重要。您是否已分配OpenSaleItem.OpenSale


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

请不要懒惰-使用适当缩进格式化代码,以便可能尝试回答的人更容易阅读。