目前我的存储库包含以下代码:
public interface IRepository<T> where T : class
{
T Get(int id);
IQueryable<T> GetAll();
IQueryable<T> Where(Expression<Func<T, bool>> predicate);
IQueryable<T> Query();
void Add(T entity);
void Remove(T entity);
void Save();
}
public class Repository<T> : IRepository<T> where T : class
{
private readonly IContextProvider _ctxProvider;
protected BaseModelContext _ctx
{
get
{
return _ctxProvider.DataContext;
}
}
public Repository(IContextProvider ctx)
{
_ctxProvider = ctx;
}
public T Get(int id)
{
return _ctx.Set<T>().Find(id);
}
public IQueryable<T> GetAll()
{
return _ctx.Set<T>();
}
public IQueryable<T> Where(Expression<Func<T, bool>> predicate)
{
return _ctx.Set<T>().Where(predicate);
}
public void Add(T entity)
{
_ctx.Set<T>().Add(entity);
}
public void Remove(T entity)
{
_ctx.Set<T>().Remove(entity);
}
public IQueryable<T> Query()
{
return _ctx.Set<T>().AsQueryable();
}
public IQueryable<T> Eager(string path)
{
return _ctx.Set<T>().Include(path);
}
public void Save()
{
_ctx.SaveChanges();
}
}
我已经从数据库创建了我的EDMX模型,但是我注意到你将使用_ctx.Set来模拟每个类模式的代码优先表,而实体上没有Set()方法由生成的.edmx文件创建。我原以为EF可以很容易地在两种类型之间切换。我是否必须重新编写我的存储库类,以便它可以与EDMX模型一起使用?
答案 0 :(得分:0)
默认情况下,模型优先和数据库第一种方法VS2010生成基于ObjectContext的上下文和基于EntityObject的实体。这在VS2012中发生了变化,默认情况下将生成POCO实体和基于DbContext的上下文。 CodeFirst使用POCO实体和基于DbContext的上下文,该上下文符合VS2012但不符合VS2010。但是,即使使用VS2010,您也可以生成DbContext和POCO实体。首先,右键单击设计器表面,然后在属性中将代码生成策略从默认更改为无。然后右键单击您的项目并“添加新项目”。点击左侧的“在线”。您可以在搜索对话框中键入DbContext。选择“EF 4.x DbContext Generator for C#”。这将为您的项目添加T4模板,该模板将从您的edmx文件生成基于DbContext的上下文和POCO实体。