我创建了“父母”对象。父对象包含“子代”对象的列表。
当我保存父对象时,我希望子对象也被保存,但是只有父对象被保存到数据库中。
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。
任何帮助表示赞赏!谢谢
答案 0 :(得分:0)
由于您正在使用Inverse(),因此在客户端也要建立关系很重要。您分配了OpenSaleItem.OpenSale吗?
如果这不能解决问题,请进行更新以显示尝试执行创建的实际代码,包括会话和事务管理。