我對MVC 3非常陌生,但不是軟件,所以當我決定在MVC 3中啓動應用程序時,我想讓它成爲可測試的。所以我找到了這個great article關於如何實現存儲庫模式。如何在MVC 3應用程序中將代碼優先轉換爲數據庫優先
在本文中,最後,他們提出了一個非常好的「通用存儲庫」,您可以重複使用大多數對象,因爲在正常情況下,我們都希望能夠刪除,創建,更新等。
一切工作正常(閱讀編譯),直到我意識到我指向我前一段時間使用「代碼優先」方法創建的舊數據庫上下文。從那時起,我決定採用「數據庫優先」的方法,但我忘了刪除這個舊的上下文。所以我只是更改存儲庫中上下文的名稱,希望一切都能正常工作,但不起作用。我的舊上下文是一個DBContext,但我的新上下文似乎是一個ObjectContext。我不知道是什麼2
在我的通用存儲庫中的代碼都爲後續並沒有錯誤關於這些三線有關設置和輸入方法之間的區別:
this.dbSet = context.Set<TEntity>();
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;
}
}
如果有人能幫助我解決這個問題嗎?
我可以問爲什麼你先從Code First改爲db? –
當我考慮應用程序時,我總是首先創建我的數據庫。對我來說更自然。當我開始使用代碼時,我一直在考慮代碼如何生成數據庫。此外,生成的數據庫不完整,對於字符串等的varchar(5000)是完整的,所以你絕對需要在最後清理它。出於所有這些原因,我在一天內創建了數據庫,然後非常容易地生成了上下文。我會在下面嘗試你的回答,並回到你身邊! –
我可以理解想要控制數據庫的工作方式。但是,關於列大小,您可以使用屬性或流暢配置來控制列大小。但是,您仍然可以先使用代碼並自行修改數據庫。使用實體框架電動工具將您的數據庫逆向工程到Code First模型。 –