Предотвращение проверки в Entity Framework 4 - PullRequest
1 голос
/ 09 декабря 2010

Я использую Entity Framework 4 и сайт динамических данных, чтобы предоставить доступ к простому интерфейсу администратора нескольким пользователям.В целом работает довольно хорошо, но я столкнулся с этой одной проблемой на нескольких полях моей модели.

В некоторых таблицах есть поля, связанные с аудитом - CreatedBy, CreatedDate, ModifiedBy и ModifiedDate.Эти поля являются обязательными в базе данных, и соответствующие модели помечают свойства как необнуляемые (все как и должно быть).Однако я передаю установку значений для этих полей в коде - шаблоны полей для типов полей помечают эти конкретные поля как отключенные на странице, и в событии SavingChanges я устанавливаю эти поля в соответствующие значения.Все работает отлично , когда я обновляю существующий элемент.

Проблема возникает, когда я пытаюсь создать новый элемент.Я хочу, чтобы эти поля оставались пустыми на странице и автоматически заполнялись моим кодом при отправке, но шаблоны полей настраивали RequiredFieldValidators для этих полей и не позволяли мне отправлять их без значения.Обычно это было бы здорово, за исключением того, что я хочу помешать EF проверять эти поля в момент отправки страницы.

Я понимаю, что могу пометить поля в базе данных как обнуляемые, и это решит проблему -это, вероятно, было бы даже хорошо с точки зрения данных, но мне это неудобно - во-первых, не исключено, что некоторые из моделей, в которых появляются эти поля, будут загружены в массовом порядке, возможно, кем-то другим, позжеДата.Я бы предпочел, чтобы база данных обеспечивала необнуляемость этих полей.В шаблонах полей я попытался переместить встроенный вызов SetUpValidator (), чтобы RequiredFieldValidator не выполнялся, когда эти конкретные поля загружаются, и я также попытался отключить RequiredFieldValidators и заставить их свойство IsValid иметь значение true.Ни одно из этих действий не позволяет мне отправить страницу.

Есть ли способ заставить EF / Dynamic Data пропустить проверку для некоторых полей?

EDIT

Как отмечено ниже, я также попытался пометить их как обнуляемые в модели, а не в базе данных, что вызвало ошибку: Problem in mapping fragments...Non-nullable column...in table...is mapped to a nullable entity property.

EDIT # 2

Я нашел решение, которое работает, но требует изменения автоматически сгенерированного файла конструктора для набора сущностей, который в лучшем случае хрупок.Мне бы хотелось узнать «правильный» способ сделать это, но если ничего не станет очевидным в ближайшие пару дней, я отправлю свой ответ.

Ответы [ 2 ]

1 голос
/ 21 марта 2011

Итак, вот изменения, которые я нашел, я должен был сделать.Когда инструмент позволяет создавать сущности в файле edmx Designer.cs, я получаю свойства, подобные этим:

для даты и времени на стороне сервера

 [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();
    }
 }

для varchar

 [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, достаточно установить для параметра IsNullable атрибута EdmScalarPropertyAttribute значение true, чтобы избежать этой проблемы.Для свойства String вы также должны изменить 2-й параметр вызова метода SetValidValue на «true».

Все это говорит, единственная причина, по которой я оставляю это какэто потому, что я не ожидаю, что мне придется создавать объекты более одного или двух раз, прежде чем мы перейдем на другую платформу для этого сайта.И в этом случае объединение версии, в которой я зарегистрировался, с git, с версией, сгенерированной инструментом, позволяет мне избежать большинства головных болей,

0 голосов
/ 30 декабря 2010

Вот моя мета-информация для автоматически сгенерированного поля даты, доступного только для чтения. Я не получаю средства проверки, проверяющие эти поля. Надеюсь, это поможет.

[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; }
...