4

我的数据库有一个不可为空的字段,但可以包含一个空字符串。当我尝试使用 connection.SaveChanges() 保存记录时,我收到一个异常提示“MyField 字段是必需的”。

我创建了一个 BuddyClass 如下,但我仍然收到消息:

namespace MyNamespace {
[MetadataType(typeof(QuesT_Metadata))] public partial class QuesT { }
public class QuesT_Metadata {
    [Required(AllowEmptyStrings = true)
    public string MyField { get; set; }
}
}

我可以使用 ErrorMessage 属性来更改引发的错误中的消息,因此我知道 Buddy Class 工作正常,但显然Required 属性不是。

我也尝试包含属性 DisplayFormat(ConvertEmptyStringToNull = false),但得到了相同的结果。

我以前做过,而且下面的第一个参考似乎说它应该工作,所以我很难过。任何人都可以帮忙吗?

参考文献(只有前两个似乎直接相关,但其他可能仍然有帮助):

http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.requiredattribute.allowemptystrings.aspx
http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.displayformatattribute .convertemptystringtonull.aspx
如何使实体框架属性不为 NULL,但在表单提交中不需要
数据注释属性在 MVC 应用程序中使用伙伴类元数据不起作用
EF伙伴类上使用自定义属性 (AttributeTargets.Class) 进行数据验证

4

2 回答 2

1

我在同一条船上......我有几个你的确切行为的例子,它们工作得很好......

现在,一个特定的领域不会表现...

但是,如果我不使用“Required(AllowEmptyStrings = true)”属性,事情就会恢复正常。我想这是我真正想要的,因为有问题的属性并没有那么大的意义(必需,但允许用户不要回答)......

对我来说,更大的问题是为什么它有时有效,有时无效?

但是至少,删除类似的代码应该可以为您解决问题。

于 2015-01-12T14:47:01.240 回答
0

我通过捕获错误解决了这个问题:

public static class ExtensionMethods {
public static void SaveChangesWithEmptyStrings(this DbContext context) {
    try {
        context.SaveChanges();
    }
    catch (DbEntityValidationException ex) {
        foreach (DbEntityValidationResult result in ex.EntityValidationErrors)
            foreach (DbValidationError error in result.ValidationErrors) {
                Type t = result.Entry.Entity.GetType();
                PropertyInfo pi = t.GetProperty(error.PropertyName);
                pi.SetValue(result.Entry.Entity, "");
            }
        context.SaveChanges(); // Try again
    }
}

}

于 2015-01-12T18:18:51.247 回答