Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / NHibernate mapping Sum() + Fluent / 13 сообщений из 13, страница 1 из 1
06.07.2011, 12:58
    #37339040
Var79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NHibernate mapping Sum() + Fluent
В NHibernate есть возможность на сущность мапить поле из другой таблицы .
Мне нужно почти то же самое, только мапить сумму по полям из другой таблицы.
Все банально:
Есть Order, есть Items.Amount
нужно посчитать Order.Amount = Sum(Items.Amount) where Order.Id = Items.OrderId

Хочу сделать это не запросами/критериям, а в мапинге, что бы всегда когда выбирается Order, для него считалась сумма, в гугле не нагуглил, подскажите плз есть ли возможность такое делать в мапинге NHibernate, а еще лучше в Fluent?
...
Рейтинг: 0 / 0
06.07.2011, 15:59
    #37339532
SolYUtor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NHibernate mapping Sum() + Fluent
Var79,

Как сделать в обычном маппинге - тут . C Fluent'ом надо гуглить, на вскидку помочь не могу.
...
Рейтинг: 0 / 0
06.07.2011, 16:24
    #37339608
Var79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NHibernate mapping Sum() + Fluent
спасибо :)
...
Рейтинг: 0 / 0
06.07.2011, 16:45
    #37339680
SolYUtor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NHibernate mapping Sum() + Fluent
Var79,

Но вообще говоря мне не нравится такой способ. Имхо, эффективней было бы сделать примерно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
    public class Order
    {
        private decimal _totalAmount;
        private ISet<OrderItem> _orderItems;

        public Order()
        {
            _totalAmount = 0;
            _orderItems = new HashedSet<OrderItem>();
        }
        public virtual ISet<OrderItem> OrderItems
        {
            get { return new ImmutableSet<OrderItem>(_orderItems); }
        }

        public virtual decimal TotalAmount
        {
            get { return _totalAmount; }
        }

        public virtual void AddOrderItem(OrderItem item)
        {
            _orderItems.Add(item);
            _totalAmount = TotalAmount + item.Amount;
        }

        public virtual void RemoveOrderItem(OrderItem item)
        {
            _orderItems.Remove(item);
            _totalAmount = TotalAmount - item.Amount;
        }

    }

    public class OrderItem
    {
        public decimal Amount { get; set; }
    }

и маппинг для TotalAmount:
Код: plaintext
<property name="TotalAmount" access="field.camelcase-underscore"/>
...
Рейтинг: 0 / 0
06.07.2011, 16:51
    #37339709
Var79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NHibernate mapping Sum() + Fluent
насколько я вижу тут не будет считаться сумма TotalAmount если прочитать существующий Order или я ошибаюсь?
...
Рейтинг: 0 / 0
06.07.2011, 16:52
    #37339712
SolYUtor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NHibernate mapping Sum() + Fluent
Будет.
...
Рейтинг: 0 / 0
06.07.2011, 17:04
    #37339749
Var79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NHibernate mapping Sum() + Fluent
SolYUtorБудет.
то есть я сделаюorderRepository.get
...
Рейтинг: 0 / 0
06.07.2011, 17:07
    #37339754
Var79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NHibernate mapping Sum() + Fluent
SolYUtorБудет.
то есть сделаю
Код: plaintext
1.
var order = orderRepository.Get(5);
Assert.IsTrue(order.TotalAmount > 0);
и будет TotalAmount больше нуля если есть айтемы?
хм а как это работает?
...
Рейтинг: 0 / 0
06.07.2011, 17:08
    #37339758
Var79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NHibernate mapping Sum() + Fluent
я не вижу запроса к БД c Sum()
...
Рейтинг: 0 / 0
06.07.2011, 17:23
    #37339791
SolYUtor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NHibernate mapping Sum() + Fluent
Var79,

Var79то есть сделаю
Код: plaintext
var order = orderRepository.Get(5);


Если делаете шаблон Repository поверх сессии NHibernate - то выкиньте его нафиг. Рано или поздно вам будут нужны всё новые возможности NHibernate, и в итоге он либо будет дублировать интерфейс сессии, либо сильно ограничивать возможности.
Var79
Код: plaintext
Assert.IsTrue(order.TotalAmount > 0);
и будет TotalAmount больше нуля если есть айтемы?
хм а как это работает?
Вы код читали?
Var79я не вижу запроса к БД c Sum()
Он и не нужен! Мы немного денормализовали данные в угоду производительности.
NHibernate отображает вашу объектную на реляционную. В приведённом мною коде поле _totalAmount поддерживается в правильном состоянии при удалении/добавление строк заказа. Замаплено оно на доступ непосредственно к полю _totalAmount, и это поле будет сохранено в БД.
...
Рейтинг: 0 / 0
06.07.2011, 18:03
    #37339898
Var79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NHibernate mapping Sum() + Fluent
SolYUtorМы немного денормализовали данные в угоду производительности. Замаплено оно на доступ непосредственно к полю _totalAmount, и это поле будет сохранено в БД.
теперь понял, спасибо :-)
...
Рейтинг: 0 / 0
06.07.2011, 18:07
    #37339912
Var79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NHibernate mapping Sum() + Fluent
SolYUtor
Код: plaintext
<property name="TotalAmount" access="field.camelcase-underscore"/>

access="field.camelcase-underscore"
а это для чего?
...
Рейтинг: 0 / 0
06.07.2011, 18:19
    #37339944
SolYUtor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NHibernate mapping Sum() + Fluent
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / NHibernate mapping Sum() + Fluent / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]