Как мне переопределить get;задавать;свойства поля? - PullRequest
1 голос
/ 29 апреля 2011

Я работаю с базой данных, которая по независящей от меня причине - я не могу изменить схему.

В этой базе данных есть поле "CertificateId", которое не может иметь значение NULL, однако полепо-прежнему считается необязательным.Когда я загружаю это поле в свою модель (я использую первый подход к БД), оно, конечно, помечается как необнуляемое, как вы можете видеть в designer.cs

[EdmScalarPropertyAttribute(EntityKeyProperty = false, IsNullable = false)]
[DataMemberAttribute()]
public global::System.String CertificateId
{
    get
    {
        return _CertificateId;
    }
    set
    {
        OnCertificateIdChanging(value);
        ReportPropertyChanging("CertificateId");
        _CertificateId = StructuralObject.SetValidValue(value, false);
        ReportPropertyChanged("CertificateId");
        OnCertificateIdChanged();
    }
}

Поскольку этополе является необязательным, иногда оно принимает значение NULL, что, очевидно, не проходит проверку.

Есть ли способ перегрузки этих свойств, которые генерируются автоматически?Я хотел бы иметь возможность проверить, является ли значение, переданное в свойство set, нулевым, и, если оно есть, установить его в пустую строку, прежде чем оно перейдет к проверке.

Или возможно ли переопределитьметаданные для этого свойства и для IsNullable установлено значение true?

Ответы [ 4 ]

1 голос
/ 30 апреля 2011

Прежде всего, если поле считается не обнуляемым, вы не должны устанавливать его значение равным нулю.Как только вы вручную присваиваете нуль в своем коде, это ваша ошибка.

Другая проблема, которую необходимо решить, - это значение по умолчанию (ноль), если вы не присваиваете значение.Это хорошо обсуждается в этом вопросе - мне нравится способ инициализации поля с помощью конструктора.

Если по каким-либо причинам предыдущие два варианта не соответствуют вашим, у вас есть последний вариант изменениязначение переопределено SaveChanges.Что-то вроде:

public override int SaveChanges(SaveOptions options)
{
    var data = context.ObjectStateManager
                      .GetObjectStateEntries(EntityState.Added | EntityState.Modified)
                      .Where(e => !e.IsRelationship)
                      .Select(e => e.Entity)
                      .OfType(MyEntity);

    foreach(var entity in data)
    {
        if (entity.CertificateId == null)
        {
            entity.CertificateId = String.Empty;
        }
    }

    return base.SaveChanges(options);
}
0 голосов
/ 03 мая 2011

Спасибо, ребята, я просто использовал конструктор в частичном классе, чтобы установить мой стандарт:

public partial class Emp_Certificate
{
    //Constructor
    public Emp_Certificate()
    {
        this.CertificateID = "";
    }
}
0 голосов
/ 30 апреля 2011

Если вы создали классы модели с помощью дизайнера, то вы можете вручную установить для этого свойства значение NULL в вашей модели.

0 голосов
/ 29 апреля 2011

Если ваше поле является необязательным, почему бы не сделать столбец базы данных обнуляемым вместо ввода пустой строки?

Вы можете использовать poco или обновить существующий файл шаблона структуры сущностей (шаблоны T4), чтобы добавить нулевую проверку в шаблон, и при создании классов структуры сущностей используется ваш шаблон. Я постараюсь найти вам ссылки, которые я использовал в прошлом.

Вот информация об использовании POCO http://msdn.microsoft.com/en-us/library/dd456853.aspx

Другой способ справиться с этим - создать хранимую процедуру, добавить ее в вашу модель и обработать логику, чтобы пустые строки были пустыми внутри sp.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...