C# 如何在MVC 3应用程序中将代码优先的存储库转换为数据库优先的存储库
我对MVC 3非常陌生,但对软件不熟悉,所以当我决定用MVC 3启动一个应用程序时,我想让它可以测试。因此,我找到了如何实现存储库模式的方法 在本文的最后,他们提出了一个非常好的“通用存储库”,您可以对大多数对象重复使用它,因为在正常情况下,我们都希望能够删除、创建、更新等等 一切都很正常(读编译),直到我意识到我指向的是我的旧数据库上下文,它是不久前用“代码优先”方法创建的。从那时起,我决定采用“数据库优先”的方法,但我忘了删除这个旧上下文。因此,我只是在存储库中更改上下文的名称,希望一切都能正常工作,但它不起作用。我的旧上下文是DBContext,但我的新上下文似乎是ObjectContext。我不确定这两个之间有什么区别 我的通用存储库中的代码如下所示,关于Set和Entry方法的这三行代码有错误: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启动一个应用程序时,我想让它可以测试。因此,我找到了如何实现存储库模式的方法 在本文的最后,他们提出了一个非常好的“通用存储库”,您可以对大多数对象重复使用它,因为在正常情况下,我们都希望能够删除、创建、更新等等 一切都很正常(读编译),直到我意识到我指向的是我的旧数据库上下文,它是不久前用“代码优先”方法创建的。从那时起,我决定采用“数据库优先”的方法,但我忘了删除这个旧上下文。因此,我只是在存储库中更改上下文的名称,希望一切都能
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!我懂了!非常有趣。今晚我要试试!