C# 如何在MVC 3应用程序中将代码优先的存储库转换为数据库优先的存储库

C# 如何在MVC 3应用程序中将代码优先的存储库转换为数据库优先的存储库,c#,asp.net-mvc-3,repository-pattern,database-first,C#,Asp.net Mvc 3,Repository Pattern,Database First,我对MVC 3非常陌生,但对软件不熟悉,所以当我决定用MVC 3启动一个应用程序时,我想让它可以测试。因此,我找到了如何实现存储库模式的方法 在本文的最后,他们提出了一个非常好的“通用存储库”,您可以对大多数对象重复使用它,因为在正常情况下,我们都希望能够删除、创建、更新等等 一切都很正常(读编译),直到我意识到我指向的是我的旧数据库上下文,它是不久前用“代码优先”方法创建的。从那时起,我决定采用“数据库优先”的方法,但我忘了删除这个旧上下文。因此,我只是在存储库中更改上下文的名称,希望一切都能

我对MVC 3非常陌生,但对软件不熟悉,所以当我决定用MVC 3启动一个应用程序时,我想让它可以测试。因此,我找到了如何实现存储库模式的方法

在本文的最后,他们提出了一个非常好的“通用存储库”,您可以对大多数对象重复使用它,因为在正常情况下,我们都希望能够删除、创建、更新等等

一切都很正常(读编译),直到我意识到我指向的是我的旧数据库上下文,它是不久前用“代码优先”方法创建的。从那时起,我决定采用“数据库优先”的方法,但我忘了删除这个旧上下文。因此,我只是在存储库中更改上下文的名称,希望一切都能正常工作,但它不起作用。我的旧上下文是DBContext,但我的新上下文似乎是ObjectContext。我不确定这两个之间有什么区别

我的通用存储库中的代码如下所示,关于Set和Entry方法的这三行代码有错误:

this.dbSet = context.Set<TEntity>();

if (context.Entry(entityToDelete).State == EntityState.Detached)

context.Entry(entityToUpdate).State = EntityState.Modified;
this.dbSet=context.Set();
if(context.Entry(entityToDelete.State==EntityState.Detached)
context.Entry(entityToUpdate.State=EntityState.Modified;
以下是存储库的完整代码

public class GenericRepository<TEntity> where TEntity : class
{
    internal RecettesMaisonDBEntities context;
    internal DbSet<TEntity> dbSet;

    public GenericRepository(RecettesMaisonDBEntities context)
    {
        this.context = context;
        this.dbSet = context.Set<TEntity>();
    }

    public virtual IEnumerable<TEntity> Get(
        Expression<Func<TEntity, bool>> filter = null,
        Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null,
        string includeProperties = "")
    {
        IQueryable<TEntity> query = dbSet;

        if (filter != null)
        {
            query = query.Where(filter);
        }

        foreach (var includeProperty in includeProperties.Split
            (new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
        {
            query = query.Include(includeProperty);
        }

        if (orderBy != null)
        {
            return orderBy(query).ToList();
        }
        else
        {
            return query.ToList();
        }
    }

    public virtual TEntity GetByID(object id)
    {
        return dbSet.Find(id);
    }

    public virtual void Insert(TEntity entity)
    {
        dbSet.Add(entity);
    }

    public virtual void Delete(object id)
    {
        TEntity entityToDelete = dbSet.Find(id);
        Delete(entityToDelete);
    }

    public virtual void Delete(TEntity entityToDelete)
    {
        if (context.Entry(entityToDelete).State == EntityState.Detached)
        {
            dbSet.Attach(entityToDelete);
        }
        dbSet.Remove(entityToDelete);
    }

    public virtual void Update(TEntity entityToUpdate)
    {
        dbSet.Attach(entityToUpdate);
        context.Entry(entityToUpdate).State = EntityState.Modified;
    }
}
公共类通用存储,其中tenty:class
{
内部接收器MaisondbEntities上下文;
内部数据库集;
公共通用存储库(RecettesMaisonDBEntities上下文)
{
this.context=上下文;
this.dbSet=context.Set();
}
公共虚拟IEnumerable Get(
表达式筛选器=空,
Func orderBy=null,
字符串includeProperties=“”)
{
IQueryable query=dbSet;
if(过滤器!=null)
{
query=query.Where(过滤器);
}
foreach(includeProperty.Split中的var includeProperty
(新字符[]{',},StringSplitOptions.RemoveEmptyEntries)
{
query=query.Include(includeProperty);
}
if(orderBy!=null)
{
returnorderby(query.ToList();
}
其他的
{
返回query.ToList();
}
}
公共虚拟实体GetByID(对象id)
{
返回dbSet.Find(id);
}
公共虚拟空白插入(TEntity实体)
{
添加(实体);
}
公共虚拟无效删除(对象id)
{
TEntity entityToDelete=dbSet.Find(id);
删除(entityToDelete);
}
公共虚拟无效删除(TEntity entityToDelete)
{
if(context.Entry(entityToDelete.State==EntityState.Detached)
{
数据库集连接(entityToDelete);
}
dbSet.Remove(entityToDelete);
}
公共虚拟无效更新(TEntity entityToUpdate)
{
数据库集附加(实体更新);
context.Entry(entityToUpdate.State=EntityState.Modified;
}
}

如果有人能帮我做这件事?

听起来你没有使用DbContext代码生成器

注意,这有点过时,因为他们重命名了Generator以分离4.x和5.x版本。选择适合您的情况的选项


然后,因为您的上下文是DbContext派生的,所以您可以在存储库中使用它。

我可以问一下为什么您从代码优先更改为数据库优先吗?我总是在考虑应用程序时首先创建数据库。这对我来说更自然。当我第一次开始使用代码时,我总是在思考代码将如何生成数据库。此外,生成的数据库不是干净的,其中包含了varchar(5000)for string等,因此无论如何,您都必须在最后清理它。出于所有这些原因,我在一天内创建了数据库,然后非常轻松地生成了上下文。我会在下面尝试你的答案,然后回来找你!我能理解你想要控制数据库的工作方式。但是,关于列大小,可以使用属性或配置来控制。但是,您仍然可以先使用代码,然后自己修改数据库。使用实体框架电动工具对数据库进行反向工程,以编写第一个模型。ohhhh!我懂了!非常有趣。今晚我要试试!