我正在尝试找到在实体框架中使用对象的最佳方法。我不希望我的表单知道任何有关ObjectContext的内容,因此我将所有逻辑放在实体中(我编写了部分类)。我一直在寻找其他人的经历,并没有在任何地方找到这种方法。那么,你是如何工作的?如何从ObjectContext获取对象并使用它,而不会丢失其实体状态和其他所有内容? 我已经找到了一些解决方案,但仍然想知道其他人。感谢。
答案 0 :(得分:3)
在DDD之后,让我们将您的实体与对其进行操作的逻辑分开。 就个人而言,我使用Repository模式创建了一个通用存储库以及一些在我的实体上运行的专用存储库。 reposotory可以在构造函数给定的ObjectContext上运行,或者在没有指定的情况下创建一个新的(来自配置)。
我的示例IRepository接口:
public interface IRepository<T> where T : class
{
/// <summary>
/// Return all instances of type T.
/// </summary>
/// <returns></returns>
IQueryable<T> All();
/// <summary>
/// Return all instances of type T that match the expression exp.
/// </summary>
/// <param name="exp"></param>
/// <returns></returns>
IEnumerable<T> Find(Func<T, bool> exp);
/// <summary>Returns the single entity matching the expression.
/// Throws an exception if there is not exactly one such entity.</summary>
/// <param name="exp"></param><returns></returns>
T Single(Func<T, bool> exp);
/// <summary>Returns the first element satisfying the condition.</summary>
/// <param name="exp"></param><returns></returns>
T First(Func<T, bool> exp);
/// <summary>
/// Mark an entity to be deleted when the context is saved.
/// </summary>
/// <param name="entity"></param>
void Delete(T entity);
/// <summary>
/// Create a new instance of type T.
/// </summary>
/// <returns></returns>
T CreateInstance();
/// <summary>Persist the data context.</summary>
void SaveAll();
}
答案 1 :(得分:2)
如何按照复杂性的顺序将实体框架4置于n层架构中:
顺便说一句,如果你想实现@twk发布的接口,请使用IEnumerable<T> Find(Expression<Func<T, bool>> exp);
语法进行所有查询操作。实现IEnumerable<T> Find(Func<T, bool> exp);
将导致实现整个表和内存中过滤。