我首先使用Entity Framework和Code。这是一个向我展示案例的简单例子。
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的数据库执行表达式。
那么有没有办法将Expression<Func<Person, bool>>
转换为Expression<Func<PersonEfModel, bool>>
来对数据库执行它,或者我是在错误的路径上?
答案 0 :(得分:1)
如果您真的遵循域驱动设计,那么您不需要创建2个单独的对象来表示Person
。您的Person
类已经是POCO,它代表您自己代码中所需的确切实体(您使用的是Code First)。
您只是引入额外且完全不必要的复杂性。每次更改Person
课程时,您都需要更改PersonEfModel
课程并使存储库正常工作,您需要使用某种映射器(AutoMapper)并将Person
映射到{ {1}}这完全没必要,因为2很可能是相同的。