【问题标题】:Entity Framework Required with Default Value实体框架需要默认值
【发布时间】:2016-08-25 04:50:35
【问题描述】:

我有一个 EF Code First 设置,我有一个通过注释标记为必需的特定列。此列具有在数据库中指定的默认值约束。

我想要做的是允许用户在表单上输入值,但如果他们省略它,则使用数据库中的默认值。我运气不好。

如果我不输入任何内容,表单上会显示必填错误。如果我添加[DatabaseGenerated(DatabaseGeneratedOption.Computed)] 注解,用户输入的值将被忽略,它始终使用数据库默认值。

【问题讨论】:

  • [Required] 属性在这种情况下没有多大意义。如果您有默认值,则“假装”该字段为必填项是没有意义的。
  • 我同意你的观点,但是因为这是一个字符串,如果我不指定 [Required],varchar 字段在数据库中将变为可为空(我不希望这样)。
  • 这是 EF 中的一个已知问题。据我所知,这已在 EF 7 中修复。请参阅 data.uservoice.com/forums/…。目前,您唯一的选择是使用 TSQL 声明“默认约束”。抱歉,我以为你已经知道了。
  • @Brad 为什么您没有就以下解决方案提供任何反馈?告诉我们,如果对您没有帮助,我们可以删除它。
  • @Sampath 因为两个答案都不是可接受的答案。

标签: c# entity-framework


【解决方案1】:

您可以做的是在解析表单值时执行魔术

从表单中检查特定列的用户输入时,使用

检查该列
if (!String.IsNullOrWhiteSpace(value))
    //set the value in the database entry based on user's input

上述代码仅在在表单上输入了某些内容时才将值输入数据库。

此解决方案仅在您能够在用户“提交”后解析表单的值时才有效。

【讨论】:

  • 如果数据库有默认约束,这个检查是完全没有必要的。
【解决方案2】:

这是我对这个问题的解决方案,虽然不是很好,但易于管理。

在我的模型中,我对属性进行了注释:

[DefaultValueSql("'A'")]
[DefaultValue("A")]
[Required]

DefaultValueSql 是一个自定义属性,用于在执行迁移时处理 SQL 默认列值的创建。 DefaultValue 与该值匹配。我知道这违反了 DRY,但使用此解决方案无论如何都不需要在数据库中使用默认值(我将来可能会删除它)。

在我的控制器中,在 Create/Edit ActionResult 后处理程序中我添加了这个:

    if (model.ActiveIndicator == null)
    {
        model.ActiveIndicator = ((DefaultValueAttribute)(model.GetType().GetProperty("ActiveIndicator").GetCustomAttributes(typeof(DefaultValueAttribute), true).First())).Value.ToString();
        ModelState["ActiveIndicator"].Errors.Clear(); // Removes Model Error
    }

这会将默认值设置为注释中列出的 DefaultValue,并删除此属性的 ModelState 错误,允许 ModelState.IsValid 为真。

此解决方案适用于字符串默认值,但非字符串(不能为空的类型)可能应该以不同的方式完成,可能在模型类构造函数中。

编辑:如果您使用 TryUpdateModel,则必须设置 ModelState 值而不是提交的模型值:

    if (model.ActiveIndicator == null)
    {
        var defValue = ((DefaultValueAttribute)(model.GetType().GetProperty("ActiveIndicator").GetCustomAttributes(typeof(DefaultValueAttribute), true).First())).Value.ToString();
        ModelState.SetModelValue("ActiveIndicator", new ValueProviderResult(defValue, "", CultureInfo.InvariantCulture));
        ModelState["ActiveIndicator"].Errors.Clear(); // Removes Model Error
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-21
    • 1970-01-01
    • 1970-01-01
    • 2015-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多