【问题标题】:NHibernate code mapping bag join two tablesNHibernate 代码映射包连接两个表
【发布时间】:2015-11-12 21:36:17
【问题描述】:

我对交易(如购买详细信息)对象有以下定义:

public class Transaction : MappingObject
{
    public virtual int Id { get; set; }
    public virtual IList<TransactionProduct> Products { get; set; }
}

public class TransactionMap : ClassMapping<Transaction>
{
    public TransactionMap()
    {
        Table("TRANSACTIONS_TBL");
        Id(x => x.Id, m =>
        {
            m.Column("ID");
            m.Generator(Generators.Identity);
        });
        Bag(x => x.Products, m =>
        {
            m.Inverse(true);
            m.Table("TRANSACTION_PRODUCTS_TBL");
            m.Key(k => k.Column("TRANSACTION_ID"));
            m.Lazy(CollectionLazy.NoLazy);
        }, 
        relation => relation.OneToMany(mapper => mapper.Class(typeof(TransactionProduct))));
    }
}

TransactionProduct 是这样定义的:

public class TransactionProduct : MappingObject
{
    public virtual int TransactionId { get; set; }
    public virtual int ProductId { get; set; }
    public virtual int Quantity { get; set; }

    public override bool Equals(object obj)
    {
        var t = obj as TransactionProduct;
        if (t == null)
            return false;
        if (TransactionId == t.TransactionId && ProductId == t.ProductId)
            return true;
        return false;
    }
    public override int GetHashCode()
    {
        return (TransactionId + "|" + ProductId).GetHashCode();
    }
}

public class TransactionProductMap : ClassMapping<TransactionProduct>
{
    public TransactionProductMap()
    {
        Table("TRANSACTION_PRODUCTS_TBL");
        ComposedId(map =>
        {
            map.Property(x => x.TransactionId, m => m.Column("TRANSACTION_ID"));
            map.Property(x => x.ProductId, m => m.Column("PRODUCT_ID"));
        });
        Property(x => x.Quantity, m => m.Column("QUANTITY"));
    }
}

现在,我想选择一个交易并在单个选择中填充 Products 数组(我知道我可以选择交易然后选择产品,但这是不好的做法)

所以我正在使用这个:

        using (var session = CommonDAL.GetSession())
        {
            Transaction transactionAlias = null;
            TransactionProduct transactionProductAlias = null;

            return session.QueryOver(() => transactionAlias).
                JoinAlias(() => transactionAlias.Products, () => transactionProductAlias).
                Where(() => transactionAlias.Id == transactionProductAlias.TransactionId).List().ToList();
        }

这项工作很好,但问题是,如果我有 2 个产品的交易,我会得到 2 个交易对象,其中有 2 个产品,如果我有 4 个产品的交易,我会得到 4 个交易对象4个产品。交易对象很好,但问题是重复。

我可能可以用 Distinct() 解决它,但我需要最佳实践

【问题讨论】:

    标签: c# sql-server join nhibernate transactions


    【解决方案1】:

    我在Where(...) 之后使用.TransformUsing(Transformers.DistinctRootEntity) 解决了这个问题

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-17
      • 1970-01-01
      • 2014-04-02
      • 1970-01-01
      • 1970-01-01
      • 2010-10-05
      相关资源
      最近更新 更多