我可以使用此属性装饰模型中的单个字符串 -
[Required(AllowEmptyStrings= true)]
如何为OnModelCreating中的所有必需字符串执行此操作?
注意我不想像这样关闭验证 -
mDbContext.Configuration.ValidateOnSaveEnabled = false;
答案 0 :(得分:1)
不幸的是,我认为答案就是你不能。
在FluentAPI中,您可以使用将在整个上下文中应用的自定义约定:
//All strings are required
modelBuilder.Properties<string>()
.Configure(p => p.IsRequired());
//All strings named "Foo" are required and have a maximum length
modelBuilder.Properties<string>()
.Where(p => p.Name == "Foo")
.Configure(p => p.IsRequired().HasMaxLength(256));
//All strings with a "Required" attribute have a maximum length:
modelBuilder.Properties<string>()
.Where(p => p.CustomAttributes
.Where(a => a.AttributeType == typeof(RequiredAttribute))
.Any())
.Configure(p => p.HasMaxLength(256));
问题在于Fluent API无法访问&#34; AllowEmptyStrings&#34;属性。它的设计可能是为了配置数据库。检查空字符串是通常在数据到达数据库之前完成的验证
答案 1 :(得分:0)
或者,您可以继承System.ComponentModel.DataAnnotations.RequiredAttribute
的子类,并覆盖IsValid()
方法。
根据来源:https://github.com/microsoft/referencesource/blob/master/System.ComponentModel.DataAnnotations/DataAnnotations/RequiredAttribute.cs
理想情况下,您会为“最佳做法”使用其他属性(并删除[Required]
),但就我而言,我是与设计人员一起生成模型的,因此我决定公开{{1 }}实际上是在名称空间中,因此导致我的模型使用我自己的“ Required”属性而非EF的属性。在全球范围内就像魅力一样。
虽然我在上面同意科林的观点-这不是“最佳实践”(通过EF设计),但我也不会将其称为“不良实践”。我可能会称其为“不安全的做法”。
EF举足轻重,我更喜欢以自己的方式管理数据库,而不是自己的方式。
与此相关的主要问题将是[RequiredAttribute]
类型的<TKey>
。就像默认的string
(等)一样。因此不安全。
如果可以保证您的代码正确使用,则不是问题。
例如..
(注意:我选择不覆盖
AspNetUsers
,因为以下内容远比覆盖更清洁)
IsValid
如果可以选择的话,我可能会使用[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false)]
public class RequiredAttribute : System.ComponentModel.DataAnnotations.RequiredAttribute {
public RequiredAttribute() : base() {
AllowEmptyStrings = true;
}
}
替换为适当的地方。
从长远来看,这就是我要做的事情。在设计器中,针对我特别需要它的字段使用自定义属性。但是根据您的问题,上面的答案。