我正在尝试让 EF 4.1 与 Repository、UnitOfWork、实体与 EF 的分离和验证一起工作。
我按照本指南将我的 POCO 实体与 EF 模型很好地分离,现在我正在按照本指南实施验证(使用 IValidatableObject)。
我的解决方案包括:
- Contacts.Repository [引用 EF 和 Contacts.Entities]:
- 联系人.edmx
- ContactsDbContext.cs
- Contacts.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 类与部分类分开,以在 Contacts.Entities 和 Contacts.Validation 中定义 Contact。代码不再编译,因为您无法跨不同的程序集定义分部类。
有人在这里给我指点吗?我已经在下面发布了代码...
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;
}
}