【发布时间】:2019-11-23 18:53:25
【问题描述】:
我创建了“父”对象。父对象包含一个“子”对象列表。
当我保存父对象时,我希望子对象也被保存,但只有父对象被保存到数据库中。
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。
任何帮助表示赞赏!谢谢
【问题讨论】:
-
请不要偷懒 - 使用适当的缩进格式化代码,以便可能尝试回答它的人更容易阅读。
标签: nhibernate orm fluent-nhibernate nhibernate-mapping