Entity framework 防止实体框架4中的验证

Entity framework 防止实体框架4中的验证,entity-framework,validation,dynamic-data,Entity Framework,Validation,Dynamic Data,我正在使用EntityFramework4和一个动态数据站点向一些用户公开一个简单的管理界面。一般来说工作得很好,但我在模型的几个字段中遇到了这个问题 有几个表具有一些与审核相关的字段—CreatedBy、CreatedDate、ModifiedBy和ModifiedDate。这些字段在数据库中是必需的,关联的模型将属性标记为不可为空(所有属性都应为空)。但是,我正在代码中设置这些字段的值-字段类型的字段模板在页面上将这些特定字段标记为禁用,并且在SavingChanges事件中,我将这些字段设

我正在使用EntityFramework4和一个动态数据站点向一些用户公开一个简单的管理界面。一般来说工作得很好,但我在模型的几个字段中遇到了这个问题

有几个表具有一些与审核相关的字段—CreatedBy、CreatedDate、ModifiedBy和ModifiedDate。这些字段在数据库中是必需的,关联的模型将属性标记为不可为空(所有属性都应为空)。但是,我正在代码中设置这些字段的值-字段类型的字段模板在页面上将这些特定字段标记为禁用,并且在SavingChanges事件中,我将这些字段设置为适当的值。当我更新现有项目时,所有这些都非常有效

当我尝试创建一个新项目时,问题出现了。我希望这些字段在页面上保持为空,并在提交时由我的代码自动填充,但是字段模板为这些字段设置了RequiredFieldValidator,并且不允许我在没有值的情况下提交它们。通常这会很好,除了我想防止EF在提交页面时验证这些字段

我意识到我可以在数据库中将字段标记为可为空,这将解决问题-从数据的角度来看,这可能还可以,但我不习惯这样做-首先,这些字段出现的一些模型不太可能是批量加载的,可能是由其他人加载的,在以后的某一天。我宁愿让数据库强制执行这些字段的非空性。在字段模板中,我尝试将RequiredFieldValidator的内置SetUpValidator()调用移动到加载这些特定字段时不运行的位置,我还尝试禁用RequiredFieldValidator并强制其IsValid属性为true。这些操作都不允许我提交页面

有没有办法告诉EF/Dynamic Data跳过某些字段的验证

编辑

如下所述,我还尝试在模型中而不是在数据库中将它们标记为可空,这导致了一个错误:
映射片段时出现问题……表中的不可空列……映射到可空实体属性。

编辑#2


我已经找到了一个可行的解决方案,但需要修改实体集的自动生成设计器文件,这充其量是脆弱的。我很想知道一个“更正确”的方法,但是如果在接下来的几天里没有什么明显的变化,我会发布我自己的答案。

这里是我的元数据信息,用于只读自动生成的日期字段。我没有得到验证控件来验证这些字段。希望这有帮助

[ReadOnly(true)]
[DataType(DataType.Date)]
[Column(IsDbGenerated = true, UpdateCheck = UpdateCheck.Never, AutoSync = AutoSync.Never)]
[UIHint("DateTime")]
[Display(Name = "Modified", Order = 1000)]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:d}")]
public object DateModified { get; private set; }

这是我的只读自动生成日期字段的元信息。我没有得到验证控件来验证这些字段。希望这有帮助

[ReadOnly(true)]
[DataType(DataType.Date)]
[Column(IsDbGenerated = true, UpdateCheck = UpdateCheck.Never, AutoSync = AutoSync.Never)]
[UIHint("DateTime")]
[Display(Name = "Modified", Order = 1000)]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:d}")]
public object DateModified { get; private set; }

下面是我发现我必须做的编辑。当允许工具在edmx Designer.cs文件中创建实体时,我会得到如下属性:

在服务器端查看datetime

 [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
 [DataMemberAttribute()]
 public global::System.DateTime CreatedDate
 {
    get
    {
       return _CreatedDate;
    }
    set
    {
       OnCreatedDateChanging(value);
       ReportPropertyChanging("CreatedDate");
       _CreatedDate = StructuralObject.SetValidValue(value);
       ReportPropertyChanged("CreatedDate");
       OnCreatedDateChanged();
    }
 }
为了一个瓦查尔

 [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
 [DataMemberAttribute()]
 public global::System.String CreatedBy
 {
    get
    {
       return _CreatedBy;
    }
    set
    {
       OnCreatedByChanging(value);
       ReportPropertyChanging("CreatedBy");
       _CreatedBy = StructuralObject.SetValidValue(value, false);
       ReportPropertyChanged("CreatedBy");
       OnCreatedByChanged();
    }
 }
要使其在不验证DateTime属性的情况下工作,将EdmScalarPropertyAttribute的IsNullable参数设置为true足以避免此问题。对于String属性,还必须将方法调用的第二个参数更改为“true”


所有这些都说了,我之所以保留它的唯一原因是因为我不希望在我们移动到该站点的其他平台之前,必须多次重新生成实体。在这种情况下,将我签入git的版本与该工具生成的版本合并,可以避免大多数麻烦,

因此,下面是我发现必须进行的编辑。当允许工具在edmx Designer.cs文件中创建实体时,我会得到如下属性:

在服务器端查看datetime

 [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
 [DataMemberAttribute()]
 public global::System.DateTime CreatedDate
 {
    get
    {
       return _CreatedDate;
    }
    set
    {
       OnCreatedDateChanging(value);
       ReportPropertyChanging("CreatedDate");
       _CreatedDate = StructuralObject.SetValidValue(value);
       ReportPropertyChanged("CreatedDate");
       OnCreatedDateChanged();
    }
 }
为了一个瓦查尔

 [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
 [DataMemberAttribute()]
 public global::System.String CreatedBy
 {
    get
    {
       return _CreatedBy;
    }
    set
    {
       OnCreatedByChanging(value);
       ReportPropertyChanging("CreatedBy");
       _CreatedBy = StructuralObject.SetValidValue(value, false);
       ReportPropertyChanged("CreatedBy");
       OnCreatedByChanged();
    }
 }
要使其在不验证DateTime属性的情况下工作,将EdmScalarPropertyAttribute的IsNullable参数设置为true足以避免此问题。对于String属性,还必须将方法调用的第二个参数更改为“true”


所有这些都说了,我之所以保留它的唯一原因是因为我不希望在我们移动到该站点的其他平台之前,必须多次重新生成实体。在这种情况下,将我签入git的版本与工具生成的版本合并可以避免大多数麻烦,

为什么不在模型中将它们标记为可为null,而在数据库中不可为null呢。这不管用吗?已经尝试过了(忘了把它放在我的列表中),没有-然后我得到错误,模型中有可空字段,而数据库中不可空字段。不过,谢谢!你有没有找到解决这个问题的好办法?我也有同样的问题,我不能相信所有使用EF和自动生成的CreatedDate字段的人都不是。不,现在我的解决方案是在我重新生成类时手动编辑定义。当然是次优的,但是我们已经决定动态数据站点是一个补丁,直到我们能够构建更定制的东西,这将给我机会使用EF4.1和ASP.NETMVC。在此期间的更改将是很小的,所以现在手动路由是有意义的。为什么不在模型中将它们标记为可为null而在数据库中不可为null呢。这不管用吗?已经尝试过了(忘了把它放在我的列表中),没有-然后我得到错误,模型中有可空字段,而数据库中不可空字段。不过,谢谢!你有没有找到解决这个问题的好办法?我也有同样的问题,我不能相信所有使用EF和自动生成的CreatedDate字段的人都不是。不,现在我的解决方案是在我重新生成类时手动编辑定义。当然是次优,但我们已经决定