实体框架需要默认值

本文关键字:默认值 框架 实体 | 更新日期: 2023-09-27 18:04:05

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

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

如果我不输入任何东西,Required错误将显示在表单上。如果我添加[DatabaseGenerated(DatabaseGeneratedOption.Computed)]注释,则忽略用户输入的值,并且始终使用数据库默认值。

实体框架需要默认值

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

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

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

上面这段代码只在表单中输入值时才向数据库输入值。

此解决方案仅适用于在用户'提交'之后能够解析表单值的情况

这是我对这个问题的解决方案,不是很好,但还可以管理。

在我的模型中,我用:

注释属性
[DefaultValueSql("'A'")]
[DefaultValue("A")]
[Required]

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

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

    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。

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

编辑:如果您正在使用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
    }