Entity Framework IValidatableObject referência DbContext

Estou tentando fazer com que o EF 4.1 trabalhe com Repositório, UnitOfWork, separação de entidades do EF e validaçã

Eu seguiist para obter uma boa separação das minhas entidades POCO do modelo EF e agora estou seguindoist guia para implementar a validação (com IValidatableObject

minha solução consiste em:

Contacts.Repository [referencia EF e Contacts.Entities]: Contacts.edmx ContactsDbContext.cs Contacts.Entities [sem referências]: Contact.cs (classe parcial de Contacts.Entities.Contact) Contacts.Validation [referencia Contacts.Entities and Contacts.Repository] Contact.cs (classe parcial de Contacts.Entities.Contact)

Mas estou batendo em uma parede de tijolos com a validação:

Eu não posso adicionar lógica de validação a Contacts.Entities porque causaria uma referência circular com Contacts.Repository (contact.Validate (...) precisa usar ContactsDbContext). Então, eu criei um projeto Contacts.Validation separado.Mas isso significa dividir a classe Contact com classes parciais para definir o Contato dentro de Contacts.Entities e Contacts.Validation. O código não é mais compilado porque você não pode definir uma classe parcial entre diferentes assemblie

Alguém tem alguma dica para mim aqui? Publiquei o código abaixo ...

Contacts.Repository.ContactsDbContext.cs:

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

    protected override DbEntityValidationResult ValidateEntity(DbEntityEntry entityEntry, IDictionary<object, object> 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 contém:

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

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

          yield break;
      }
  }

questionAnswers(2)

yourAnswerToTheQuestion