对于我的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);
答案 0 :(得分:1)
您主要需要了解每个目的。数据注释用于定义模型的规则和约束。这些可用于服务器端,客户端和数据库验证(用于相关部分)。定制ValidationAttribute
可用于服务器端验证。
Fluent API仅用于转换为数据库配置。在客户端,服务器端和数据库端(MaxLength(n)
)中,只有诸如varchar(n)
之类的属性具有直接含义。因此,这些属性在流利的API中确实具有直接替代项。但是,EF不会自动了解您的自定义验证在数据库中的含义。例如,在您的情况下,当最大长度为1时,验证似乎转换为一对一关系。因此,对于此示例,您可以在流畅的API中将一对一设置。在这种情况下,EF无法检查代码并无法理解验证的意图。
对于最大长度和最小长度的所有其他值,没有可在数据库中设置的映射配置。因此,流畅的API无法为其提供映射功能。如果您使用的数据库确实具有类似的功能,则可以查看其EF库的文档以了解映射功能。
基于您为什么希望摆脱数据注释的原因,您真正在寻找的也许是流利的验证。您可以查看该库和this git repo,它在使用该库时提供了模型的干净实现示例。