Задать условные обозначения свойств в EF Core? - PullRequest
0 голосов
/ 03 октября 2018

В NHibernate у них была изящная небольшая концепция соглашения, где вы могли бы сказать, что если у объекта есть свойство Name, и это строка, вы можете применить к ней определенное поведение БД (например, установить его).не ноль, максимальная длина x, может быть уникальной, если вы можете быть уверены, что все имена будут уникальными).

Это был бы небольшой класс, вы бы добавили его в свою фабрику экземпляров, и bam!Модель БД будет построена соответственно.

Есть ли в EF Core аналогичный механизм?Кажется, я не могу найти ничего, и нелепое количество плавных конфигураций для каждого объекта для каждого свойства довольно утомительно.

1 Ответ

0 голосов
/ 03 октября 2018

В EF Core встроенные соглашения используются для создания начальной модели, которую вы можете переопределить или изменить в OnModelCreating.

Вы можете просто перебирать объекты и свойства, переопределяя соглашения.Это работает достаточно хорошо вместо пользовательских соглашений от EF6, что (по крайней мере, пока) пользовательские соглашения не вышли из отставания.См. https://github.com/aspnet/EntityFrameworkCore/issues/214 для статуса и некоторые примеры.Это также довольно распространенный шаблон для чтения пользовательского атрибута в OnModelCreating для управления (или переопределения) конфигурации вашей сущности.

Итак, ваш пример:

, если у сущности есть свойство Name,и это была строка, к ней можно было применить определенное поведение БД (например, установить ее не равной NULL, максимальной длиной x, может быть уникальной, если вы могли быть уверены, что все имена будут уникальными).

будет выглядеть примерно так:

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        var props = from e in modelBuilder.Model.GetEntityTypes()
                    from p in e.GetProperties()
                    where p.Name == "Name"
                       && p.PropertyInfo.PropertyType == typeof(string)
                    select p;

        foreach (var p in props)
        {
            p.SetMaxLength(200);
            p.IsNullable = false;
            p.DeclaringEntityType.AddKey(p);
        }

        base.OnModelCreating(modelBuilder);
    }

Или если вы хотите принудительно установить типы данных для всех столбцов DataTime, например:

    var dateProps = from e in modelBuilder.Model.GetEntityTypes()
                from p in e.GetProperties()
                where p.PropertyInfo.PropertyType == typeof(DateTime)
                select p;
    foreach (var prop in dateProps)
    {
        prop.Relational().ColumnType = "datetime2(4)";

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...