C# 问题与自我多对多加入流利的NHibernate

C# 问题与自我多对多加入流利的NHibernate,c#,fluent-nhibernate,C#,Fluent Nhibernate,我是一个完全流利的新手,虽然我在网上发现了很多关于多对多的加入,但在我目前的情况下,我没有发现太多 注:好的,这可能是垃圾设计,我最好是单独制作桌子,对设计的侮辱表示感谢:) 我有一张这样的桌子: 以及以下类别: [Serializable] public class Transaction : Entity { [DomainSignatureAttribute] public virtual long TransactionId { get; protected inter

我是一个完全流利的新手,虽然我在网上发现了很多关于多对多的加入,但在我目前的情况下,我没有发现太多

注:好的,这可能是垃圾设计,我最好是单独制作桌子,对设计的侮辱表示感谢:)

我有一张这样的桌子:

以及以下类别:

[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);
    }
}
地图:


我正在调整周围的东西,从nHibernate得到各种各样的错误-有人请告诉我什么是最好的方法来解决这个问题???

Gah,发现问题-在Jonas指出另一个设置后,我想问题一定是复合键-答案是什么?不要使用复合密钥

即使设置了Version()属性集,nHibernate也认为所有的瞬态对象都是相同的,因此当我试图在一次命中中添加3个事务时,就搞砸了


这个问题的解决方案是,如果其他人遇到相同的问题,则向多对多表添加一个自动递增键,并将其用作nHibernate中的键,这使得nHibernate更容易区分瞬态对象

看起来类似于这个问题谢谢Jonas,这是我开始的地方,因此映射看起来类似,但是我的映射会产生问题。我得到了以下信息:具有相同标识符值的另一个对象已与实体TransactionSystem.TransactionLink的会话TransactionSystem.TransactionLink关联。
[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);
    }