К основному контенту

Select happy medium in practices of Entity Framework

Between 3 most known practices of Entity Framework (Code First, Model First, Database First) I selected one happy medium, because no one is perfect by itself. I like clean POCO classes of Code First, but it is not so easy to handle a good scheme/structure of database without modelling. In Database First and Model First I don't like EDMX files and a lot of redundancy.

So I found a perfect solution for me:

1. I do modelling in any Modelling tool which supports generating SQL scripts for SQL Server.

Picture. Part of ready scheme.

2. Create database and execute script in SQL Management Studio

3. And... here is... make a Reverse Engineering of database into model POCO classes (just like Code First) with Visual Studio plug-in: Entity Framework Power Tools

Picture. Plugin for Reverse Engineering installed.

Picture. Here command to select for Reverse Engineering.

Picture. Result is POCO classes in the Models folder of my Model project. It includes database context, classes and mapping-classes.

Next step is to use ANY useful Inversion Of Control Framework and use Repository and Storage patterns to use database in any part of my project. So, I got flexible and nice structure. You may find an example of using Simple Injector in my MVC project. ModelContainer is class which registers all classes/repositories and services to resolve dependencies between them. Repositories supports simple operations for any database object/POCO class: Insert, GetById, Delete, Update.

namespace Phi.Repository
{
    using System.Web;
    using Microsoft.AspNet.Identity;
    using Phi.Models;
    using SimpleInjector;

    public class ModelContainer
    {
        private static readonly Container _instance;

        static ModelContainer()
        {
            _instance = new Container();

            _instance.Register<IDbContext, phiContext>();
            _instance.RegisterManyForOpenGeneric(
                typeof(IRepository<>),
                new[]
                {
                    typeof(EfRepository<PhiUser>),
                    typeof(EfRepository<Role>),
                    typeof(EfRepository<UserAttribute>),
                    typeof(EfRepository<UserRole>),
                    typeof(EfRepository<UserClaim>),
                    typeof(EfRepository<UserLogin>),
                    typeof(EfRepository<Setting>),
                    …
                });
            _instance.Register<IAuthProvider, AuthProvider>();
            _instance.Register<HttpContextBase>(() => new HttpContextWrapper(HttpContext.Current));
            _instance.Register<IUserStore<PhiUser>, UserStore>();
            _instance.Register<IUserClaimStore<PhiUser>, UserStore>();
            _instance.Register<IUserLoginStore<PhiUser>, UserStore>();
            _instance.Register<IUserRoleStore<PhiUser>, UserStore>();
            _instance.Register<IUserPasswordStore<PhiUser>, UserStore>();

            _instance.Register<IRoleStore<Role>, RoleStore>();

            …
        }

        public static Container Instance
        {
            get
            {
                return _instance;
            }
        }
    }
}

...and last step is to register your Injector in Application_Start method:

protected void Application_Start()
{
    …
    var container = ModelContainer.Instance;

    var assem = Assembly.GetExecutingAssembly();
    container.RegisterMvcControllers(assem);
    container.RegisterMvcAttributeFilterProvider();
    container.Verify();

    // Set resolver.
    DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));
    …
}

So, I got simple POCO classes describing database model and didn't write any peace of code by myself. I create only logic. So, any change in my database could be done by simple drawing of relations and rectangles on my schema and pressing couple of buttons to generate script, create database and update model. All done automatically.

Комментарии

  1. Thank you for your great article. If you are looking for asp.net hosting feel free to visit my asp.net hosting review site at http://cheaphostingasp.net.

    ОтветитьУдалить

Отправить комментарий

Популярные сообщения из этого блога

Делаем себе бесплатный VPN на Amazon EC2

Читать этот пост в Telegraph. Другие посты в канале в Telegram. Кто только не расписывал уже пошаговые инструкции по этой теме. Однако, время идёт, ПО меняется, инструкции нуждаются в обновлении, а люди в современной России всё больше нуждаются в применении VPN. Я собираюсь описать все шаги для создания бесплатного сервера на Amazon EC2 с операционной системой Linux и необходимые команды для настройки VPN сервера на нём. Чтобы не повторяться о деталях, которые были много раз описаны на русскоязычных и англоязычных ресурсах, по ходу статьи я просто приведу целую кипу ссылок, где можно почерпнуть необходимую информацию, а где информация устарела - опишу подробнее что нужно сдеать. В итоге, сервер будет доступен для вас из любой точки планеты, с любой операционной системы, и бесплатно (с определёнными ограничениями по трафику). Шаг первый - Регистрируемся на Amazon AWS Нужно зайти на сайт https://aws.amazon.com/ru и сразу перейти к Регистрации, нажав одноимённую кнопку. При р

В помощь программисту: инструкции по работе с Ubuntu сервером

Программистам чаще приходится писать код и заботиться о его чистоте, правильных абстракциях в коде, корректных зависимостях и прочих сложностях профессии. При этом, настройка и обслуживание серверов, хоть и связанная область - это отдельный навык, необходимый не каждому, и помнить о котором в деталях сложно. Поэтому, я делаю ряд микро-инструкций, которыми буду пользоваться и сам, когда необходимо. Это не статьи, а пошаговые помощники, которые я буду дополнять и наполнять по мере надобности. Делаем бесплатный VPN на Amazon EC2 Создание ключей SSH Подключение к серверу через SSH Передача файла с Linux сервера наWindows машину Делаем VPN сервер на Ubuntu 20.04 используя OpenVPN и EasyRSA  Отображение GUI с Linux сервера на Windows машине

Выбираем все плюсы из трех парадигм Entity Framework

Между парадигмами разработки с Entity Framework (Code First, Model First, Database First) я выбрал промежуточную, потому что ни одна меня не устраивала полностью. В Code First меня радуют чистые POCO классы, но не устраивает невозможность моделирования базы. В Database First и Model First мне не нравится генерация EDMX и другого всего лишнего. Таким образом, я нашел для себя такое решение: 1. Я моделирую схему в любой удобной программе (тут любая внешняя программа моделирования, генерирующая SQL Server-совместимые скрипты генерации базы) Рис. Смоделированная схема БД. 2. Создаю базу в SQL Management Studio 3. Делаю Reverse Engineering базы в POCO классы (как в Code First) с помощью плагина Entity Framework Power Tools Рис. Установленный плагин для Reverse Engineer. Рис. Вот так делается Reverse Engineer базы данных в POCO классы. Рис. Результат генерации POCO классов на основе базы данных: папочка Models с готовым контекстом, классами объектов и маппинг-классами.