2016-12-05 50 views
0

所以,我非常感到有些微不足道的微軟建議的教程 - 我相信有合同被錯過,但我很驚訝,無處可尋找到線索。模擬實體框架與內存測試雙

我想在內存測試中實現對某個實體框架5實現的雙重實現。我嘗試了MSDN's tutorial on EF 6,它的工作原理非常簡單(顯然數據只對一個上下文持久 - 因爲DbSet只在給定的上下文中被引用)。但是,微軟建議的教程for EF 5 and earlier,它根本不切入它。我敢打賭,錯過了一些合同,導致我得到「不能隱式轉換類型..FakeSomeModelDbSet到System.Data.Entity.DbSet」!但不知道我應該把什麼放在:(擴展)部分,還有什麼我應該重寫。

基本上,這是我的基地模擬DbSet實現:

abstract class MockDbSet<T> : IDbSet<T> where T : class 
{ 
    #region Properties 

    protected ObservableCollection<T> _data; 
    protected IQueryable _query; 

    Type IQueryable.ElementType 
    { 
     get { return this._query.ElementType; } 
    } 

    System.Linq.Expressions.Expression IQueryable.Expression 
    { 
     get { return this._query.Expression; } 
    } 

    IQueryProvider IQueryable.Provider 
    { 
     get { return this._query.Provider; } 
    } 

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() 
    { 
     return _data.GetEnumerator(); 
    } 

    IEnumerator<T> IEnumerable<T>.GetEnumerator() 
    { 
     return _data.GetEnumerator(); 
    } 

    #endregion 

    #region Public Methods 

    public MockDbSet() 
    { 
     this._data = new ObservableCollection<T>(); 
     this._query = _data.AsQueryable<T>(); 
    } 

    public T Find(params object[] keyValues) 
    { 
     return this._data.Single(x => this._GetObjectKey(x) == (Guid)keyValues.Single()); 
    } 

    public T Add(T entity) 
    { 
     this._data.Add(entity); 
     return entity; 
    } 

    public T Remove(T entity) 
    { 
     this._data.Remove(entity); 
     return entity; 
    } 

    public T Attach(T entity) 
    { 
     this._data.Add(entity); 
     return entity; 
    } 

    public T Detach(T entity) 
    { 
     this._data.Remove(entity); 
     return entity; 
    } 

    public T Create() 
    { 
     return Activator.CreateInstance<T>(); 
    } 

    public TDerivedEntity Create<TDerivedEntity>() where TDerivedEntity : class, T 
    { 
     return Activator.CreateInstance<TDerivedEntity>(); 
    } 

    public ObservableCollection<T> Local 
    { 
     get { return this._data; } 
    } 

    #endregion 

    #region Protected Methods 

    protected abstract Guid _GetObjectKey(T entity); 

    #endregion 
} 

下面是它的一個實現,旨在取代原有的DbSet

class FakeSomeModelbSet : MockDbSet<SomeModel> 
{ 
    protected override Guid _GetObjectKey(SomeModel entity) 
    { 
     return entity.SomeModelId; 
    } 
} 

在這裏,我要如何來把整個東西勾在一定的DbContext ..

class MockingContext:OriginContext 
{ 
    public MockCpdContext() 
    { 
     base.SomeModel = new FakeSomeModelbSet(); 
    } 
} 

不要問我使用Moq加入一個庫是不行的,因爲我不是負責人只是一個低編碼的無人機。如果你問我OriginContext的實現,它是由Database-first方法生成的..所以..我可以,但那不會有太大的幫助。

說實話,在線索來自上教程代碼public class FakeDbSet<T> : IDbSet<T>)和原DbSet實施public class DbSet<TEntity> : DbQuery<TEntity>, IDbSet<TEntity>, IQueryable<TEntity>, IEnumerable<TEntity>, IQueryable, IEnumerable, IInternalSetAdapter where TEntity : class)簽名的區別..但不知道該怎麼辦..真的。

回答

0

那麼,我剛剛意識到,在實體框架5 DbSet只有一個構造函數與內部修改器。直接繼承DbSet本身是不可能的,只有通過將替換爲DbContext纔可能,IDbSet只能通過修改.Context.tt文件進行編輯。