Пользовательские аннотации данных к Fluent-API - PullRequest
0 голосов
/ 24 января 2019

Для моего приложения ef core я создал несколько классов, ограниченных DataAnnotations.то есть мне пришлось определить пользовательский атрибут, который гарантирует, что IList будет содержать хотя бы один элемент.

Пользовательский ValidationAttribute:

public class ListLengthAttribute : ValidationAttribute
{
    public int Min { get; set; }
    public int Max { get; set; }

    public ListLengthAttribute()
    {
        Min = 0;
        Max = int.MaxValue;
    }

    public override bool IsValid(object value)
    {
        IList listValue = value as IList;

        if (listValue != null)
        {
            int listLength = listValue.Count;
            return listLength >= Min && listLength <= Max;
        }

        return false;
    }
}

Полученный класс может выглядеть как-токак:

public class Dummy 
{
    [ListLength( Min = 1, ErrorMessage = "Each dummy should contain at least 1 foo." )]
    public List<Foo> Foos { get; set; }
}

Теперь я хочу полностью отойти от DataAnnotations и использовать (ef-core) Fluent-API.

Есть ли способ отобразить вышеуказанное ограничение, покаиспользуя ModelBuilder в моем EntityFrameworkCore.DbContext классе?

Может быть что-то вроде:

modelBuilder.Entity<Dummy>().Property( d => d.Foos ).MinLength(1);

1 Ответ

0 голосов
/ 24 января 2019

Вам в основном нужно понимать цели каждого из них. Аннотации данных используются для определения правил и ограничений для вашей модели. Они могут использоваться для проверки базы данных на стороне сервера, на стороне клиента и (для соответствующих частей ). Пользовательский ValidationAttribute может использоваться для проверки на стороне сервера.

Свободный API используется исключительно для перевода в конфигурацию базы данных. Только атрибуты, такие как MaxLength(n), имеют прямое значение на стороне клиента, сервера и базы данных (varchar(n)). Таким образом, эти атрибуты имеют прямые альтернативы в свободном API. Однако EF не будет автоматически понимать, что означает ваша пользовательская проверка в вашей базе данных. Например, в вашем случае проверка, по-видимому, переводится в отношение один к одному, когда максимальная длина равна 1. Итак, для этого примера восприятия вы можете установить один к одному в свободном API. EF не может проверить код и понять намерение проверки в такой ситуации.

Для всех других значений максимальной длины и минимальной длины нет конфигурации сопоставления, которая может быть установлена ​​в базе данных. Следовательно, свободный API не может иметь функциональности сопоставления для него. Если база данных, которую вы используете, имеет аналогичную функцию, вы можете обратиться к документации по ее библиотеке EF для функции отображения.

Исходя из того, почему вы хотели бы отойти от аннотаций данных, то, что вы действительно ищете, может быть быстрой проверки. Вы можете заглянуть в эту библиотеку и это git repo , которое предоставляет пример чистой реализации моделей при использовании этой библиотеки.

...