Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何防止实体框架强制验证子对象属性?_C#_Entity Framework_Asp.net Mvc 3_Entity Framework 4 - Fatal编程技术网

C# 如何防止实体框架强制验证子对象属性?

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

我有一个ASP.NETMVC3项目,它使用.NET4.0框架和EntityFramework4.4。我在实体框架中使用代码优先的w/迁移方法

我有一个对象A,它的属性是对象B。对象A实际上只需要知道对象B的id,但MVC正在对对象B强制执行所有注释验证,因为我在对象A中标记了它所需的(它是)。ModelState.IsValid始终返回false,因为提交表单时,对象B上的某些验证失败

例如:

    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不是一个选项。总的来说,注释验证是正确的。不过,对于某些实体来说,这个示例有点像是一个特例。