我正在使用Fluent NHibernate。这是一对多关系的经典案例。我有一个包含许多SupplyAmount子项的Supply父级。
Supply父对象正在使用正确的信息进行保存,但是在保存父项时,金额未插入到数据库中。我怎么做级联不工作?
实体如下:
public class Supply : BaseEntity
{
public Guid SupplyId { get; set; }
public string LastName { get; set; }
public string FirstName { get; set; }
public string Comments { get; set; }
public virtual IList<SupplyAmount> Amounts { get; set; }
public Supply()
{
Amounts = new List<SupplyAmount>();
}
public virtual void AddAmount(SupplyAmount amount)
{
amount.Supply = this;
Amounts.Add(amount);
}
}
public class SupplyAmount : BaseEntity
{
public virtual Guid SupplymountId { get; set; }
public virtual Supply Supply { get; set; }
public virtual int Amount { get; set; }
}
映射如下:
public class SupplyMap : ClassMap<Supply>
{
public SupplyMap()
{
Id(x => x.SupplyId);
Map(x => x.LastName);
Map(x => x.FirstName);
Map(x => x.Comments);
HasMany<SupplyAmount>(x => x.Amounts)
.Inverse().Cascade.SaveUpdate()
.KeyColumn("SupplyAmountId")
.AsBag();
}
}
public class SupplyAmountMap : ClassMap<SupplyAmount>
{
public SupplyAmountMap()
{
Id(x => x.SupplyAmountId);
References(x => x.Supply, "SupplyId").Cascade.SaveUpdate();
Map(x => x.Amount);
}
}
这就是我所说的:
public SaveIt()
{
Supply sOrder = Supply();
sOrder.FirstName = "TestFirst";
sOrder.LastName = "TestLast";
sOrder.Comments = "TestComments";
for (int i = 0; i < 5; i++)
{
SupplyAmount amount = new SupplyAmount();
amount.Amount = 50;
amount.Supply = sOrder;
sOrder.AddAmount(amount);
}
// This call saves the Supply to the Supply table but none of the Amounts
// to the SupplyAmount table.
AddSupplyOrder(sOrder);
}
答案 0 :(得分:0)
我知道这是一个老帖子,但为什么不...
// This call saves the Supply to the Supply table but none of the Amounts
SaveIt()中的此注释表示您调用Supply上的保存而不是金额。 在这种情况下,你的逻辑错误。
所以解决这个问题:
SupplyMap - &gt;对于金额,逆量不应该存在。
HasMany<SupplyAmount>(x => x.Amounts).Cascade.SaveUpdate();
SupplyAmountMap - &gt; 删除引用(x =&gt; x.Supply,“SupplyId”)。Cascade.SaveUpdate(); 替换为
References<Supply>(x=>x.Supply);
您现在应该只对供应对象上的保存进行调用,它将级联到金额。
Session.Save(supply);
在您安排供应和供应量之后的测试中,请确保拨打电话 调用Session.flush() 保存后强制进入。 这在代码中并不重要,因为在调用供应对象之前通常会在事务中运行。
干杯, 巧克力
另外作为旁注,通过流畅的映射来表达通常不是一个好主意。让默认的东西做这件事,这就是为什么我会建议反对列命名提示。