UnitOfWork和GenericRepository Pattern是否首先在EF 4.1代码中是多余的?

时间:2011-04-23 07:13:51

标签: unit-testing mocking repository-pattern entity-framework-4.1 unit-of-work

想知道我是否需要使用Genericrepository模式和UnitOfWork来模拟存储库。我正在使用MOQ.Is它现在是多余的,因为我注意到EF 4.1有IDBSet。

我还没弄明白如何编写一些通用的IDBSet。如果你有一个实例IDBSet的例子,你可以向我展示吗?

有什么建议吗?

3 个答案:

答案 0 :(得分:29)

这是已经在SO上讨论的许多主题的重复,但我同意其中一些很难找到,因为它们嵌套在其他问题中

我希望这会给你一些答案。如果没有,请随时在此处或在新问题中询问更多信息。

答案 1 :(得分:0)

public class MockDbSet<T> : IDbSet<T> where T : class,  new()
    {
        private List<T> _entities;

        public MockDbSet(List<T> entities)
        {
            _entities = entities;
        }

        public virtual T Add(T entity)
        {
            _entities.Add(entity);
            return entity;
        }

        public virtual T Attach(T entity)
        {
            _entities.Add(entity);
            return entity;
        }

        public TDerivedEntity Create<TDerivedEntity>() where TDerivedEntity : class, T
        {
            return new T() as TDerivedEntity;
        }

        public virtual T Create()
        {
            return new T();
        }

        public virtual T Find(params object[] keyValues)
        {
            throw new NotImplementedException();
        }

        public System.Collections.ObjectModel.ObservableCollection<T> Local
        {
            get
            {
                return new ObservableCollection<T>(_entities);
            }
        }

        public virtual T Remove(T entity)
        {
            _entities.Remove(entity);
            return entity;
        }

        public IEnumerator<T> GetEnumerator()
        {
            return _entities.GetEnumerator();
        }

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

        public Type ElementType
        {
            get { return _entities.AsQueryable().ElementType; }
        }

        public System.Linq.Expressions.Expression Expression
        {
            get { return _entities.AsQueryable().Expression; }
        }

        public IQueryProvider Provider
        {
            get { return _entities.AsQueryable().Provider; }
        }
    }

答案 2 :(得分:0)

此外,我想补充一点,关于实体框架的通用存储库和工作单元是多余的,请查看此链接http://rob.conery.io/2014/03/04/repositories-and-unitofwork-are-not-a-good-idea/