如何将我的存储库从EF代码优先切换到使用EDMX实体模型?

时间:2012-12-28 18:44:42

标签: entity-framework code-first edmx

目前我的存储库包含以下代码:

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模型一起使用?

1 个答案:

答案 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实体。