C# 如何防止实体框架强制验证子对象属性?
我有一个ASP.NETMVC3项目,它使用.NET4.0框架和EntityFramework4.4。我在实体框架中使用代码优先的w/迁移方法 我有一个对象A,它的属性是对象B。对象A实际上只需要知道对象B的id,但MVC正在对对象B强制执行所有注释验证,因为我在对象A中标记了它所需的(它是)。ModelState.IsValid始终返回false,因为提交表单时,对象B上的某些验证失败 例如:C# 如何防止实体框架强制验证子对象属性?,c#,entity-framework,asp.net-mvc-3,entity-framework-4,C#,Entity Framework,Asp.net Mvc 3,Entity Framework 4,我有一个ASP.NETMVC3项目,它使用.NET4.0框架和EntityFramework4.4。我在实体框架中使用代码优先的w/迁移方法 我有一个对象A,它的属性是对象B。对象A实际上只需要知道对象B的id,但MVC正在对对象B强制执行所有注释验证,因为我在对象A中标记了它所需的(它是)。ModelState.IsValid始终返回false,因为提交表单时,对象B上的某些验证失败 例如: public class FormField { public int
public class FormField
{
public int Id { get; set; }
[MaxLength(50)]
[Required]
[DisplayName("Field Name")]
public string Name { get; set; }
[Required]
public Form Form { get; set; }
}
public class Form
{
public Form()
{
Fields = new List<FormField>();
}
public int Id { get; set; }
[Required]
public string Name { get; set; }
public List<FormField> Fields { get; set; }
}
公共类FormField
{
公共int Id{get;set;}
[MaxLength(50)]
[必需]
[显示名称(“字段名称”)]
公共字符串名称{get;set;}
[必需]
公共表单{get;set;}
}
公开课表格
{
公共表格()
{
字段=新列表();
}
公共int Id{get;set;}
[必需]
公共字符串名称{get;set;}
公共列表字段{get;set;}
}
编辑现有FormField时,这不是问题,因为我可以在页面上放置一个带有Form.Name属性的隐藏字段(我仍然认为这是不必要的)。创建新FormField时会出现此问题。我显示表单的下拉列表(这是从我的视图模型填充的),并使该字段指向FormField.Form.Id属性。ASP.NET MVC仍然需要formField.Form.Name(因为它在表单对象上标记为必需)
如果我从FormField对象的Form字段中删除“[Required]”注释,验证将不会启动,但这将使Form.Id的外键在数据库中可以为null,而它不应该为null
有什么想法吗?我可能在这里做错了什么,但我不完全确定是什么。也许您可以删除
[必需]
属性,而使用EFfluent API来配置:
modelBuilder.Entity<FormField>().Property(ff => ff.Form).IsRequired();
modelBuilder.Entity().Property(ff=>ff.Form.IsRequired();
我删除了FormField.Form上的[Required]注释。这并没有解决问题。我尝试将“[Bind(Exclude=“vm.FormField.Form”)]”添加到正在发布的参数中。这将停止绑定,但确保ModelState中仍然存在验证错误
最终,我不得不做:
ModelState.Remove("FormField.Form.Id");
ModelState.Remove("FormField.Form.Name");
这就避免了我遇到的ModelState错误。因为我实际上只需要Form.Id,所以我在ViewModel“SelectedForm”中有一个属性,并将该属性用于该值
所以…这是可行的,但是…这似乎是一个相当乏味的解决方案,好像我在FormField.Form对象上有更多必填字段,我必须列出每个字段,并以字符串形式硬编码属性名称
有人能想出一种改进这种方法的方法吗?看看Doku的anwser等等。有一个ValidateOnSaveEnabled选项()@MartijnvanPut我仍在研究Doku so的答案并考虑它。我要说的是,将ValidateOnSaveEnabled属性设置为false不是一个选项。总的来说,注释验证是正确的。不过,对于某些实体来说,这个示例有点像是一个特例。