этот комментарий заслуживает ответа
аюсь заставить EF 4.1 работать с репозиторием, UnitOfWork, отделением сущностей от EF и проверкой.
Я последовал заэто руководство, чтобы получить хорошее отделение моих сущностей POCO от модели EF, и теперь я следуюэто руководство по внедрению валидации (с IValidatableObject).
Мое решение состоит из:
Contacts.Repository [ссылки EF и Contacts.Entities]:Contacts.edmxContactsDbContext.csContacts.Entities [нет ссылок]:Contact.cs (Contacts.Entities.Contact частичный класс)Contacts.Validation [ссылки Contacts.Entities и Contacts.Repository]Contact.cs (Contacts.Entities.Contact частичный класс)Но я бью кирпичную стену с проверкой:
Я не могу добавить логику проверки в Contacts.Entities, потому что это вызовет циклическую ссылку с Contacts.Repository (contact.Validate (...) должен использовать ContactsDbContext). Поэтому я создал отдельный проект Contacts.Validation.Но это означает разделение класса Contact с частичными классами для определения Contact внутри Contacts.Entities и Contacts.Validation. Код больше не компилируется, потому что вы не можете определить частичный класс в разных сборках.У кого-нибудь есть указания для меня здесь? Я разместил код ниже ...
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 содержит:
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;
}
}