Fluent-API的自定义数据注释

时间:2019-01-24 15:40:57

标签: .net-core data-annotations ef-fluent-api ef-core-2.1

对于我的ef核心应用程序,我创建了一些受DataAnnotations约束的类。一世。 e。我必须定义一个自定义属性,以确保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核心)Fluent-API。

在我的ModelBuilder类中使用EntityFrameworkCore.DbContext时,有什么方法可以映射上述约束?

也许像这样:

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

1 个答案:

答案 0 :(得分:1)

您主要需要了解每个目的。数据注释用于定义模型的规则和约束。这些可用于服务器端,客户端数据库验证(用于相关部分)。定制ValidationAttribute可用于服务器端验证。

Fluent API仅用于转换为数据库配置。在客户端,服务器端和数据库端(MaxLength(n))中,只有诸如varchar(n)之类的属性具有直接含义。因此,这些属性在流利的API中确实具有直接替代项。但是,EF不会自动了解您的自定义验证在数据库中的含义。例如,在您的情况下,当最大长度为1时,验证似乎转换为一对一关系。因此,对于此示例,您可以在流畅的API中将一对一设置。在这种情况下,EF无法检查代码并无法理解验证的意图。

对于最大长度和最小长度的所有其他值,没有可在数据库中设置的映射配置。因此,流畅的API无法为其提供映射功能。如果您使用的数据库确实具有类似的功能,则可以查看其EF库的文档以了解映射功能。

基于您为什么希望摆脱数据注释的原因,您真正在寻找的也许是流利的验证。您可以查看该库和this git repo,它在使用该库时提供了模型的干净实现示例。