#nhibernate #fluent-nhibernate #nhibernate-mapping
#nhibernate #свободно-nhibernate #nhibernate-сопоставление
Вопрос:
У меня есть дизайн тестовой базы данных, подобный этому:
Следующий псевдокод:
//BhillHeader
public class BillHeader
{
public BillHeader()
{
BillDetails = new List<BillDetail>();
}
public virtual int BillNo { get; set; }
public virtual IList<BillDetail> BillDetails { get; set; }
public virtual decimal Amount { get; set; }
public virtual void AddDetail(BillDetail billdet)
{
BillDetails.Add(billdet);
}
}
//BillHeader Map
public class BillHeaderMap : ClassMap<BillHeader>
{
public BillHeaderMap()
{
Table("BillHeader");
LazyLoad();
Id(x => x.BillNo).GeneratedBy.Identity().Column("BillNo");
Map(x => x.Amount).Column("Amount").Not.Nullable();
HasMany(x => x.BillDetails).KeyColumn("BillNo").Cascade.All().Inverse();
}
}
//BillDetail
public class BillDetail
{
public BillDetail() { }
public virtual int BillID { get; set; }
public virtual int SeqNo { get; set; }
public virtual BillHeader BillHeader { get; set; }
public virtual decimal Amt { get; set; }
public override bool Equals(object obj)
{
var other = obj as BillDetail;
if (ReferenceEquals(null, other)) return false;
if (ReferenceEquals(this, other)) return true;
return this.BillID == other.BillID amp;amp;
this.SeqNo == other.SeqNo;
}
public override int GetHashCode()
{
unchecked {
int hash = GetType().GetHashCode();
hash = (hash * 31) ^ SeqNo.GetHashCode();
hash = (hash * 31) ^ BillID.GetHashCode();
return hash;
}
}
}
//BillDetail Map
public class BillDetailMap : ClassMap<BillDetail>
{
public BillDetailMap()
{
Table("BillDetail");
LazyLoad();
CompositeId().KeyProperty(x => x.BillID, "BillNo").KeyProperty(x => x.SeqNo, "SeqNo");
References(x => x.BillHeader).Column("BillNo");
Map(x => x.Amt).Column("Amt").Not.Nullable();
}
}
//-----------------------------------------------------------------------------------------------------------------------------
//Program
public createBillNo()
{
var sessionFactory = CreateSessionFactory();
using (var session = sessionFactory.OpenSession()) {
using (var sqlTrans = session.BeginTransaction()) {
BillHeader billNo1 = new BillHeader() { Amount = 2500.00M};
BillDetail bh11 = new BillDetail() { SeqNo = 1, Amt = 200.00M };
BillDetail bh12 = new BillDetail() { SeqNo = 2, Amt = 300.00M };
BillDetail bh13 = new BillDetail() { SeqNo = 3, Amt = 500.00M };
AddBillDetailsToBillHeader(billNo1, bh11, bh12, bh13);
session.SaveOrUpdate(billNo1);
sqlTrans.Commit();
}
}
}
private void AddBillDetailsToBillHeader(BillHeader billHeader, params BillDetail[] billDetails)
{
foreach (var billdet in billDetails) {
billHeader.AddDetail(billdet);
billdet.BillHeader = billHeader;
}
}
Когда я запускаю это, я получаю следующее исключение:
Недопустимый индекс 3 для этого SqlParameterCollection с Count = 3
Пожалуйста, помогите мне решить эту проблему.
Комментарии:
1. скорее всего, поскольку столбец «BillNo» отображается дважды, он пытается добавить параметр 2 для 1 столбца, отсюда ошибка OutOfRange
Ответ №1:
скорее всего, поскольку столбец «BillNo» отображается дважды, он пытается добавить параметр 2 для 1 столбца, отсюда ошибка OutOfRange. переместите ссылку в compositekey
CompositeId()
.KeyReference(x => x.BillHeader, "BillNo")
.KeyProperty(x => x.SeqNo, "SeqNo");
// References(x => x.).Column("BillNo"); <-- Remove
Комментарии:
1. Привет @Firo, спасибо за вашу помощь. Это помогло мне решить эту проблему.