3

我首先使用实体​​框架和代码。这是一个简单的例子,向您展示我的情况。

public class PersonEfModel
{
    public int Id { get; set; }
    public string Vorname { get; set; }
    public string Nachname { get; set; }
}

public class EfContext : DbContext
{
    public DbSet<Person> Personen { get; set; }
}

为了独立于数据访问的实现,我编写了一个带有存储库的抽象层。

public class Person
{
    public int Id { get; set; }
    public string Vorname { get; set; }
    public string Nachname { get; set; }
}

public interface IGenericRepository<T>
{
    int Count { get; }

    void Add(T item);
    void Delete(T item);
    void Update(T item);

    T GetData(int id);
    IEnumerable<T> GetData();
    IEnumerable<T> GetData(int offset, int count);

    IEnumerable<T> Find(Expression<Func<T,bool>> predicate);
    IEnumerable<T> Find(IEnumerable<Expression<Func<T, bool>>> predicates);
}

Person并且PersonEfModel必须是两种不同的类型才能完全独立于数据库模型。所以会有一个 Person 类型的通用存储库,但我真的不知道如何实现 Find 方法。我只能对依赖于 PersonEfModel 而不是 Person 的数据库执行表达式。

那么有没有办法将 aExpression<Func<Person, bool>>转换为 aExpression<Func<PersonEfModel, bool>>以针对数据库执行它,还是我走错了路?

4

1 回答 1

1

如果您真正遵循领域驱动设计,那么您不需要创建 2 个单独的对象来表示Person. 您的Person类已经是 POCO,它代表了您在自己的代码中需要的确切实体(毕竟您使用的是 Code First)。

您只是在引入额外且完全不必要的复杂性。每次更改Person课程时,您都需要更改PersonEfModel课程并让存储库正常工作,您需要使用某种映射器(AutoMapper)并映射PersonPersonEfModel它是完全不必要的,因为两者很可能是相同的。

于 2013-03-25T14:13:32.310 回答