Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
«если бизнес-логика определяется структурой базы данных (да-да, стрелочки между табличками)»
… то это не бизнес-логика, а смех.Бизнес-логика — в разработке информационных систем — совокупность правил, принципов, зависимостей поведения объектов предметной области (области человеческой деятельности, которую система поддерживает). Иначе можно сказать, что бизнес-логика — это реализация правил и ограничений автоматизируемых операций. Является синонимом термина «логика предметной области» (англ. domain logic).Реляционная модель данных (РМД) — логическая модель данных, прикладная теория построения баз данных, которая является приложением к задачам обработки данных таких разделов математики как теории множеств и логика первого порядка.Что делать если к этой базе должно подключаться стороннее приложение?Предполагается, что доступ до приложения (данных) будет через сервис (XML/JSON и т.д.)
Что делать если структура данных изменилась?1. Удаляем метро
Что делать при регулярно-меняющейся отчётности?Мы используем ReportingServices, который потребляет данные через XML источник данных.
public static decimal GetAgentsRoom(string name)
{
return Query.All<RoomOffer>().Where(a => a.Creator.Name == name).Sum(a => a.Price);
}Вижу только быструю разработку.
Добавить hint переименования. Hint — подсказка для ORM что же делать с БД при наличии различий между схемой построенной по классам и реальной схемой в SQL
1. А как же печальные случаи когда в место 1 джоина делается 100 запросов по связанной сущности?
С# не включает в себя sql:) Бизнес приложения — это в большинстве просто редакторы БД, все крутится вокруг БД => бизнес логику лучше хранить в БД. ООП фишек лучше здесь избегать, нужен простой понятный код.
4. Незнаю. Опять же придется думать какой же sql сгенерится. Зачем? Проще самому написать.
То есть надо знать два языка вместо одного.
Но у нас, например, в PHP, все ORM реализованы из рук вон плохо, неэффективно, тащат в рантайме десятки классов, делают кучу лишних действий и т.д. А как с этим дела в .NET? Подозреваю, что так же.
Вот сделают нормальную компиляцию/генерацию быстрого ORM кода, чтобы из описания предметной области генерировались минималистичные классы моделей — тогда будем использовать. А так выгоднее руками запросы писать, хотя бы тормозить не будет.
Более того, почему вообще 1 модели должен соотвествовать один класс? Можно сделать 1 класс на всю предметную область (класс с именем типа Storage, который в себе уже все инкапсулирует). А у вас по тяжелому объекту на каждую запись в таблице создается. Так ресурсов никаких не хватит.
Более того, почему вообще 1 модели должен соотвествовать один класс? Можно сделать 1 класс на всю предметную область (класс с именем типа Storage, который в себе уже все инкапсулирует). А у вас по тяжелому объекту на каждую запись в таблице создается. Так ресурсов никаких не хватит.
А если вам надо перебрать к примеру 1000 записей в цикле, вы что, будете (неявно) создавать 1000 объектов, читать данные из БД и вызывать 1000 * 20 сеттеров?Если эти объекты невозможно обработать запросом, то в любом случае они будут загружены в память.
СобытияОни на то и события, чтобы указывать возможность выполнить код.
/// <summary>
/// Выражение для поля суммы
/// </summary>
private Expression<Func<RentOfferBase, decimal>> SummExpression = a => a.Price * a.Count;
/// <summary>
/// Сумма
/// Вычисляемое поле
/// </summary>
[VirtualField("SummExpression")]
public decimal Summ { get; set; }Там, где классический разработчик напишет 1-2 простых запроса без джойнов, ORM нагенерирует такое
2) мы хотим иерархические комментарии, чтобы список комментариев выбирался из БД легким индексируемым запросом без джойнов. Для этого как нельзя лучше подошли бы Materialized Paths. Можно ли аннотацией без костылей и событий как-то сказать классу, что он хранит иерархические записи с использованием MP?
3) Теперь мы хотим на главной, под анонсом поста, выводить количество комментариев к нему. Очевидно, что если делать для каждого анонса SELECT COUNT(*), база прикажет долго жить.
А почему вы считаете события костылями?действительно, задача очень даже типовая и встречается часто, и вот как бы я её решил:
public interface IWithCachedUser
{
/// <summary>Ссылка на пользователя</summary>
User User { get; set; }
/// <summary>Имя пользователя (для кэширования)</summary>
string UserName { get; set; }
/// <summary>Ник</summary>
string UserNick { get; set; }
}2.Написал бы простой код проставляющий значения этих полей:public class CacheUserEvent<TEntity> : IEntityEvent<TEntity>
where TEntity : EntityBase, IWithCachedUser
{
public void AfterSave(TEntity item)
{
item.UserName = item.User.Name;
item.UserNick = item.User.Nick;
}
}<source>
Теперь для всех классов, реализующих этот интерфейс есть кэширование и не обязательно делать джойны.
Использование ORM при разработке корпоративных приложений