Fluent NHibernate-使用新列表保存新的父对象<;对象>;儿童
我创建“父”对象。父对象包含“子”对象的列表 当我保存父对象时,我希望子对象也被保存,但只有父对象被保存到数据库中 FluentNHibernate版本为1.2.0.712 NHibernate版本是3.1.0.4000 下面是我的映射和模型 父模型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
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
如果这不能解决问题,请更新以显示尝试执行创建(包括会话和事务管理)的实际代码。请不要懒惰-使用适当缩进格式化代码,以便可能尝试回答的人更容易阅读。