实体框架需要默认值
本文关键字:默认值 框架 实体 | 更新日期: 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
}