无法使用实体框架更新记录,也无法使用Repository模式更新ninject

时间:2011-08-17 15:27:05

标签: asp.net-mvc-3 entity-framework-4.1 repository-pattern ninject-2 ninject.web.mvc

我正在使用MVC3,Ninject,Ninject MVC扩展,EF 4.1

我已实施以下回购模式。

Repository.cs

public interface IRepository<T> where T : class
{
    IQueryable<T> AsQueryable();

    IEnumerable<T> GetAll();
    IEnumerable<T> Find(Expression<Func<T, bool>> where);
    T Single(Expression<Func<T, bool>> where);
    T First(Expression<Func<T, bool>> where);

    void Delete(T entity);
    void Add(T entity);
    void Attach(T entity);
}

public class Repository<T> : IRepository<T> where T : class
{
    IObjectSet<T> _objectSet;


    public Repository(IObjectContext objectContext)
    {

        _objectSet = objectContext.CreateObjectSet<T>();
        //_objectSet.MergeOption = MergeOption.NoTracking;
    }

    public IQueryable<T> AsQueryable()
    {
        return _objectSet;
    }

    public IEnumerable<T> GetAll()
    {
        return _objectSet.ToList();
    }

    public IEnumerable<T> Find(Expression<Func<T, bool>> where)
    {
        return _objectSet.Where(where);
    }

    public T Single(Expression<Func<T, bool>> where)
    {
        return _objectSet.Single(where);
    }

    public T First(Expression<Func<T, bool>> where)
    {
        return _objectSet.First(where);
    }

    public void Delete(T entity)
    {

        _objectSet.DeleteObject(entity);
    }

    public void Add(T entity)
    {
        _objectSet.AddObject(entity);
    }

    public void Attach(T entity)
    {


        _objectSet.Attach(entity);

    }
}

工作单位。

 public interface IUnitOfWork
{
    void Commit();
}

public class UnitOfWork : IUnitOfWork, IDisposable
{
    private readonly IObjectContext _objectContext;

    public UnitOfWork(IObjectContext objectContext)
    {
        _objectContext = objectContext;
    }

    public void Dispose()
    {
        if (_objectContext != null)
        {
            _objectContext.Dispose();
        }
        GC.SuppressFinalize(this);
    }

    public void Commit()
    {
        _objectContext.SaveChanges();
    }
}

ObjectContext.cs

public interface IObjectContext : IDisposable
{
    IObjectSet<T> CreateObjectSet<T>() where T : class;
    void SaveChanges();
}

public class ObjectContextAdapter : IObjectContext
{
    readonly ObjectContext _context;

    public ObjectContextAdapter(ObjectContext context)
    {
        _context = context;

    }

    public void Dispose()
    {
        _context.Dispose();
    }

    public IObjectSet<T> CreateObjectSet<T>() where T : class
    {

        return _context.CreateObjectSet<T>();
    }

    public void SaveChanges()
    {
        _context.SaveChanges();
    }
}

我使用Ninject使用以下实现在IOC中绑定它们

 public override void Load()
    {
        Bind(typeof(IRepository<>)).To(typeof(Repository<>));

        Bind<IObjectContext>().To<ObjectContextAdapter>().WithConstructorArgument("context", new MGTContainer());
        Bind<IUnitOfWork>().To<UnitOfWork>();

    }

回购模式取自此处 Repo Pattern Implementation

以下是控制器中模式的使用示例

 eventRepository.Attach(model);
        unitOfWork.Commit();

一切都适用于插入,读取和删除记录但是当我调用附件时我有以下错误

  

ObjectStateManager中已存在具有相同键的对象。 ObjectStateManager无法使用相同的键跟踪多个对象。

我尝试将绑定更改为InRequestScope,但这会导致后续错误。

提前感谢您的帮助

1 个答案:

答案 0 :(得分:0)

附件效果不佳。我正在做的只是

  1. 获取单条记录
  2. 将所有属性复制到该记录并
  3. 提交。