小编Mat*_*att的帖子

Active Records vs. Repository - 优点和缺点?

使用ActiveRecord,您可以定义这样的类:

class Contact
{
  private String _name;
  public String Name
  {
    get { return _name; }
    set 
    { 
      if (value == String.IsNullOrWhiteSpace())
        throw new ArgumentException(...);
      else
        _name = value;
    }
  }

  public Boolean Validate() { ... /* check Name is unique in DB */  }

  public Boolean Save() { ... }

  public static List<Contact> Load() { ... }
}
Run Code Online (Sandbox Code Playgroud)

虽然这很简单,但我发现我的课程变得非常臃肿,伴随着大量的逻辑组合!

使用分层/域设计,您可以定义相同的类,如:

class Contact
{
    [Required(AllowEmptyStrings=false)]
    public String Name { get; set; }
}

class ContactService : IService
{
    public List<Contact> …
Run Code Online (Sandbox Code Playgroud)

activerecord design-patterns architectural-patterns

10
推荐指数
3
解决办法
7498
查看次数

实体框架IValidatableObject参考DbContext

我正在尝试让EF 4.1与Repository,UnitOfWork一起工作,将实体与EF分离并进行验证.

我按照指南将我的POCO实体从EF模型中分离出来,现在我按照指南实现验证(使用IValidatableObject).

我的解决方案包括:

  • Contacts.Repository [引用EF和Contacts.Entities]:
    • Contacts.edmx
    • ContactsDbContext.cs
  • Contacts.Entities [无参考]:
    • Contact.cs(Contacts.Entities.Contact partial class)
  • Contacts.Validation [引用Contacts.Entities和Contacts.Repository]
    • Contact.cs(Contacts.Entities.Contact partial class)

但我正在用验证打砖墙:

  1. 我无法向Contacts.Entities添加验证逻辑,因为它会导致带有Contacts.Repository的循环引用(contact.Validate(...)需要使用ContactsDbContext).所以我创建了一个单独的Contacts.Validation项目.
  2. 但是,这意味着将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);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

Contacts.Entities.Contact.cs:

namespace Contacts.Entities
{
    public partial class Contact
    {
        public string Name { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

Contacts.Validation.Contact.cs包含: …

validation entity-framework-4.1 dbcontext

6
推荐指数
1
解决办法
4677
查看次数