EF 4.1 をリポジトリ、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.Repository との循環参照が発生するため、Contacts.Entities に検証ロジックを追加できません (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;
}
}