如何为所有Code First Required字符串设置AllowEmptyStrings?

时间:2016-03-03 13:44:26

标签: entity-framework ef-code-first

我可以使用此属性装饰模型中的单个字符串 -

[Required(AllowEmptyStrings= true)]

如何为OnModelCreating中的所有必需字符串执行此操作?

注意我不想像这样关闭验证 -

mDbContext.Configuration.ValidateOnSaveEnabled = false;

2 个答案:

答案 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;属性。它的设计可能是为了配置数据库。检查空字符串是通常在数据到达数据库之前完成的验证

参考:Custom Conventions

答案 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; } } 替换为适当的地方。 从长远来看,这就是我要做的事情。在设计器中,针对我特别需要它的字段使用自定义属性。但是根据您的问题,上面的答案。