具有默认值的实体框架

时间:2016-08-25 04:50:36

标签: c# entity-framework

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

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

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

2 个答案:

答案 0 :(得分:0)

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

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

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

上面的代码只会在数据库中输入一个值,如果在表单上输入了某些内容

只有在用户提交'后才能解析表单的值,此解决方案才有效。

答案 1 :(得分:0)

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

在我的模型中,我用以下内容注释了该属性:

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

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

在我的Controller中,在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为true。

此解决方案适用于字符串默认值,但非字符串(不能为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
    }