Я - полный беглый новичок, и хотя я нашел в сети много о соединениях «многие ко многим», я не нашел много в моем текущем сценарии.
Примечание: Хорошо, это может бытьмусор дизайн, и мне может быть лучше делать отдельные таблицы, оскорбления о дизайне приветствуются:)
У меня есть таблица, как так:

И классытакие:
[Serializable]
public class Transaction : Entity
{
[DomainSignatureAttribute]
public virtual long TransactionId { get; protected internal set; }
public virtual long AccountId { get; set; }
protected internal virtual short TransactionTypeId { get; set; }
protected internal virtual short TransactionStatusId { get; set; }
public virtual DateTime DateCreated { get; set; }
public virtual DateTime DateEffective { get; set; }
public virtual Decimal Amount { get; set; }
public virtual IList<TransactionLink> ChildTransactions { get; set; }
public virtual IList<TransactionLink> ParentTransactions { get; set; }
public Transaction()
{
ChildTransactions = new List<TransactionLink>();
ParentTransactions = new List<TransactionLink>();
}
/// <summary>
/// Use this to add a payment to a charge to pay it off, or to add a refund on a payment to un-pay it
/// </summary>
/// <param name="inTransaction"></param>
/// <param name="inAmount"></param>
public virtual void AddChildTransaction(Transaction inTransaction, Decimal inAmount)
{
TransactionLink link = new TransactionLink()
{
TransactionParent = this,
TransactionChild = inTransaction,
Amount = inAmount
};
if (!ChildTransactions.Contains(link))
ChildTransactions.Add(link);
if (!inTransaction.ParentTransactions.Contains(link))
inTransaction.ParentTransactions.Add(link);
}
/// <summary>
/// You probably shouldnt be using this.
/// </summary>
/// <param name="inTransaction"></param>
/// <param name="inAmount"></param>
public virtual void AddParentTransaction(Transaction inTransaction, Decimal inAmount)
{
TransactionLink link = new TransactionLink()
{
TransactionChild = this,
TransactionParent = inTransaction,
Amount = inAmount
};
if (!inTransaction.ChildTransactions.Contains(link))
inTransaction.ChildTransactions.Add(link);
if (!ParentTransactions.Contains(link))
ParentTransactions.Add(link);
}
}
И
[Serializable]
public class TransactionLink : Entity
{
public virtual Int64 TransactionIdParent { get; protected internal set; }
public virtual Transaction TransactionParent { get; set; }
public virtual Int64 TransactionIdChild { get; set; }
public virtual Transaction TransactionChild { get; protected internal set; }
public virtual DateTime LastModifiedOn { get; set; }
public virtual Decimal Amount { get; set; }
#region Override comparison - as this is a composite key we need to custom roll our comparison operators
#endregion
}
Карты:
public TransactionMap()
{
Id(x => x.TransactionId);
Map(x => x.AccountId);
Map(x => x.TransactionTypeId);
Map(x => x.TransactionStatusId);
Map(x => x.DateCreated);
Map(x => x.DateEffective);
Map(x => x.Amount);
HasMany(x => x.ParentTransactions).Cascade.None().KeyColumn("TransactionIdParent").LazyLoad();
HasMany(x => x.ChildTransactions).Cascade.All().KeyColumn("TransactionIdChild").LazyLoad();
}
и
public TransactionLinkMap()
{
CompositeId()
.KeyProperty(x => x.TransactionIdParent, "TransactionIdParent")
.KeyProperty(x => x.TransactionIdChild, "TransactionIdChild");
References(x => x.TransactionParent).Column("TransactionIdParent").Cascade.SaveUpdate().LazyLoad();
References(x => x.TransactionChild).Column("TransactionIdChild").Cascade.All().LazyLoad();
Version(x => x.LastModifiedOn);
Map(x => x.Amount);
}
Я все настраиваю и получаю всевиды ошибок из nHibernate - кто-нибудь, пожалуйста, скажите мне, как лучше это сделать ??