Entity Framework IValidatableObject ссылка DbContext

Я пытаюсь заставить EF 4.1 работать с репозиторием, UnitOfWork, отделением сущностей от EF и проверкой.

] Я следовал этому руководству, чтобы получить хорошее разделение моих сущностей POCO от модели EF, и теперь я следую этому руководству по реализации валидации (с IValidatableObject). Решение состоит из:

  • Contacts.Repository [ссылки EF и Contacts.Entities]:
    • Contacts.edmx
    • ContactsDbContext.cs
  • Contacts.Entities [без ссылок]:
    • Contact.cs (частичный класс Contacts.Entities.Contact)
  • Contacts.Validation [ссылки Contacts.Entities и Contacts.Repository]
    • Contact.cs (частичный класс Contacts.Entities.Contact)

Но я врезаюсь в кирпичную стену с проверкой:

  1. Я не могу добавить логику проверки в Contacts.Entities, потому что это приведет к циклической ссылке с Contacts.Repository (contact.Validate (...) должен использовать ContactsDbContext). Поэтому я создал отдельный проект Contacts.Validation.
  2. Но это означает разделение класса Contact на частичные классы для определения Contact внутри как Contacts.Entities, так и Contacts.Validation. Код больше не компилируется, потому что вы не можете определить частичный класс для разных сборок.

У кого-нибудь есть здесь для меня указатели? Я разместил код ниже ...

Contacts.Repository.ContactsDbContext.cs:

namespace Contacts.Repository
{
  public partial class ContactsDbContext : DbContext
  {
    public DbSet Contacts { get; set; }

    protected override DbEntityValidationResult ValidateEntity(DbEntityEntry entityEntry, IDictionary items)
    {
      items.Add("Context", this);
      return base.ValidateEntity(entityEntry, items);
    }
  }
}

Contacts.Entities.Contact.cs:

namespace Contacts.Entities
{
    public partial class Contact
    {
        public string Name { get; set; }
    }
}

Contacts.Validation.Contact.cs содержит:

namespace Contacts.Entities
{
  public partial class Contact : IValidatableObject
  {
      public IEnumerable Validate(ValidationContext validationContext)
      {
          ContactsDbContext contacts = (ContactsDbContext)validationContext.Items["Context"];

          //Check if Contact already exists with the same Name
          if (contacts.Any(c => c.Name == this.Name))
            yield return new ValidationResult("Contact 'Name' is already in use.", new string[] { "Name" });

          yield break;
      }
  }

6
задан Matt 27 June 2011 в 15:23
поделиться