Как обеспечить реализацию по умолчанию для метода LINV to SQL OnValidate? - PullRequest
0 голосов
/ 02 февраля 2010

Я пытаюсь реализовать структуру проверки в базовом классе для LINQ to SQL сущностей. Проблема в том, что событие OnValidate срабатывает правильно.

Причина в том, что OnValidate помечен как частичный, поэтому я не могу предоставить реализацию по умолчанию в базовом классе; он скрыт новым методом, объявленным классом LINQ to SQL.

Как это исправить, чтобы событие OnValidate в базовом классе вызывалось автоматически?

Пример кода приведен ниже.

public class EntityBase
{
    public bool IsValid
    {
        get { return (GetValidationErrors().Count() == 0); }
    }

    public virtual IEnumerable<ValidationError> GetValidationErrors()
    {
        yield break;
    }

    public void OnValidate(System.Data.Linq.ChangeAction action)
    {
        //This never gets fired unless I call explicitly in the derived class.
        if (!IsValid) 
        {
            StringBuilder sb= new StringBuilder();
            sb.AppendLine("Validation errors prevent saving");
            foreach (ValidationError error in GetValidationErrors())
            {
                sb.AppendLine(String.Format("{0}: {1}", error.PropertyName, error.ErrorMessage));
            }
            throw new ApplicationException(sb.ToString());
        }
    }
}

public partial class LinqThingy: EntityBase
{
    public override IEnumerable<ValidationError> GetValidationErrors()
    {
        if (String.IsNullOrEmpty(Name)) yield return new ValidationError("Name required", "Name");
    }

    //Eww nasty, don't want to have to do this.
    partial void OnValidate(System.Data.Linq.ChangeAction action)
    {   
        base.OnValidate(action);
    }
}

Ответы [ 2 ]

2 голосов
/ 02 февраля 2010

Вы можете переопределить метод SubmitChanges (ConflictMode) в вашем классе DataContext. Это гарантирует, что все сущности будут проверены непосредственно перед их сохранением. Таким образом, вам не нужно создавать собственный базовый класс для сущностей. Вот пример того, как расширить класс DataContext:

public partial class NorthwindDataContext
{
    public override void SubmitChanges(ConflictMode failureMode)
    {
        EntityValidator.Validate(this.GetChangedEntities());
        base.SubmitChanges(failureMode);
    }

    private IEnumerable<object> GetChangedEntities()
    {
        ChangeSet changes = this.GetChangeSet();
        return changes.Inserts.Concat(changes.Updates);
    }
}

В приведенном выше примере пользовательская логика проверки входит в метод Validate в классе EntityValidator (вам, конечно, придется его создать).

В этой статье показано, как проверять сущности с помощью технологии O / RM, такой как LINQ to SQL. Несмотря на то, что он использует блок приложения для проверки корпоративных библиотек, статья может быть применима в вашей ситуации.

0 голосов
/ 11 апреля 2018

Если вы ищете BaseDataContext для наследования, мой пример следующий:

public class BaseDataContext : DataContext
{
  // constructor is needed if you have different contexts
    public BaseDataContext(string fileOrServerOrConnection) : base(fileOrServerOrConnection)
    {
    }

    public override void SubmitChanges(ConflictMode failureMode)
    {
        try
        {
            base.SubmitChanges(failureMode);
        }
        catch (Exception ex)
        {
// do whatever you would like with the exception
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...