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

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

Как сделать в обычном маппинге - тут . C Fluent'ом надо гуглить, на вскидку помочь не могу.
...
Рейтинг: 0 / 0
NHibernate mapping Sum() + Fluent
    #37339608
Var79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо :)
...
Рейтинг: 0 / 0
NHibernate mapping Sum() + Fluent
    #37339680
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
NHibernate mapping Sum() + Fluent
    #37339709
Var79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
насколько я вижу тут не будет считаться сумма TotalAmount если прочитать существующий Order или я ошибаюсь?
...
Рейтинг: 0 / 0
NHibernate mapping Sum() + Fluent
    #37339712
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Будет.
...
Рейтинг: 0 / 0
NHibernate mapping Sum() + Fluent
    #37339749
Var79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolYUtorБудет.
то есть я сделаюorderRepository.get
...
Рейтинг: 0 / 0
NHibernate mapping Sum() + Fluent
    #37339754
Var79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolYUtorБудет.
то есть сделаю
Код: plaintext
1.
var order = orderRepository.Get(5);
Assert.IsTrue(order.TotalAmount > 0);
и будет TotalAmount больше нуля если есть айтемы?
хм а как это работает?
...
Рейтинг: 0 / 0
NHibernate mapping Sum() + Fluent
    #37339758
Var79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я не вижу запроса к БД c Sum()
...
Рейтинг: 0 / 0
NHibernate mapping Sum() + Fluent
    #37339791
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
NHibernate mapping Sum() + Fluent
    #37339898
Var79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolYUtorМы немного денормализовали данные в угоду производительности. Замаплено оно на доступ непосредственно к полю _totalAmount, и это поле будет сохранено в БД.
теперь понял, спасибо :-)
...
Рейтинг: 0 / 0
NHibernate mapping Sum() + Fluent
    #37339912
Var79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolYUtor
Код: plaintext
<property name="TotalAmount" access="field.camelcase-underscore"/>

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


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