NHibernate: Лучший способ справиться с промежуточной таблицей, используя Fluent NHibernate? - PullRequest
0 голосов
/ 24 ноября 2008

Как бы вы отобразили следующее в Fluent NHibernate?

См. «18.3. Клиент / Заказ / Продукт»

http://www.hibernate.org/hib_docs/nhibernate/html/example-mappings.html

1 Ответ

6 голосов
/ 25 ноября 2008

Следующее решение использует тот же подход, что и решение в примере, и сгенерированный XML так же хорош, как и тот же. Для краткости я опустил указание имен столбцов и подобных вещей.

Домен:

public class Customer
{
    private ISet<Order> orders = new HashedSet<Order>();

    public long Id { get; set; }
    public string Name { get; set; }
    public ISet<Order> Orders
    {
        get { return orders; }
        private set { orders = value; }
    }
}

public class Order
{
    public long Id { get; set; }
    public DateTime Date { get; set; }
    public Customer Customer { get; set; }
    public IList<LineItem> LineItems { get; private set; }
}

public class LineItem
{
    public int Quantity { get; set; }
    public Product Product { get; set; }
}

public class Product
{
    public long Id { get; set; }
    public string SerialNumber { get; set; }
}

Отображение:

public class CustomerMap : ClassMap<Customer>
{
    public CustomerMap()
    {
        Id(x => x.Id)
            .GeneratedBy.Native();

        Map(x => x.Name);

        HasMany<Order>(x => x.Orders)
            .IsInverse()
            .AsSet();
    }
}

public class OrderMap : ClassMap<Order>
{
    public OrderMap()
    {
        Id(x => x.Id)
            .GeneratedBy.Native();

        Map(x => x.Date);

        References<Customer>(x => x.Customer);
        HasMany<LineItem>(x => x.LineItems)
            .Component(c =>
                {
                    c.Map(x => x.Quantity);
                    c.References<Product>(x => x.Product);
                }).AsList();
    }
}

public class ProductMap : ClassMap<Product>
{
    public ProductMap()
    {
        Id(x => x.Id)
            .GeneratedBy.Native();

        Map(x => x.SerialNumber);
    }
}

Чтобы увидеть сгенерированное сопоставление XML, вы можете использовать этот код:

        Configuration config = new Configuration().Configure();
        PersistenceModel model = new PersistenceModel();

        model.addMappingsFromAssembly(typeof(CustomerMap).Assembly);
        model.Configure(config);

        model.WriteMappingsTo("your folder name here"); 

Надеюсь, это поможет.

/ Erik

...