info
info

Reputation: 69

unit of work and repository update and add don't work

I am trying to implement unit of work and repository and all get and find works fine but i cant access the add and the update and delete. All other function which get things is ok (see screenshot)

enter image description here

IRepository interface:

public interface IRepository<TEntity> where TEntity : class 
{
     IEnumerable<TEntity> GetAll();
     TEntity GetByID(int Id);
     IEnumerable<TEntity> Find(Expression<Func<TEntity,bool>> predicate);
     void Add(TEntity entity);
     void AddRange(IEnumerable<TEntity> entities);
     void Remove(TEntity entity);
     void RemoveRange(IEnumerable<TEntity> entities);
     void Update(TEntity entity);
     void Save();
}

Repository class

public class Repository<TEntity> : IRepository<TEntity> where TEntity : class
{
    private MemoryDataContext context;

    public Repository(MemoryDataContext context)
    {
        this.context = context;
    }

    public IEnumerable<TEntity> GetAll()
    {
        return context.Set<TEntity>().ToList();
    }

    public TEntity GetByID(int id)
    {
        return context.Set<TEntity>().Find(id);
    }

    IEnumerable<TEntity> IRepository<TEntity>.Find(Expression<Func<TEntity, bool>> 
          predicate)
    {
       return context.Set<TEntity>().Where(predicate);
    }

    void IRepository<TEntity>.Add(TEntity entity)
    {
        context.Set<TEntity>().Add(entity);
    }

    void IRepository<TEntity>.AddRange(IEnumerable<TEntity> entities)
    {
        context.Set<TEntity>().AddRange(entities);
    }

    void IRepository<TEntity>.Remove(TEntity entity)
    {
        context.Set<TEntity>().Remove(entity);
    }

    void IRepository<TEntity>.RemoveRange(IEnumerable<TEntity> entities)
    {
        context.Set<TEntity>().RemoveRange(entities);
    }

    void IRepository<TEntity>.Update(TEntity entity)
    {
        context.Set<TEntity>().Update(entity);
    }

    public void Save()
    {
        context.SaveChanges();
    }

    private bool disposed = false;

    protected virtual void Dispose(bool disposing)
    {
        if (!this.disposed)
        {
            if (disposing)
            {
                context.Dispose();
            }
        }
        this.disposed = true;
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }
}

Here is IUnitOfWork interface:

public interface IUnitOfWork : IDisposable
{
     Repository<Person> personRepository { get; }
     Repository<Country> countryRepository { get; }
     int Complete(); 
}

Upvotes: -1

Views: 86

Answers (1)

jarmanso7
jarmanso7

Reputation: 609

As explained in the other answer that @Progman has commented under your question, you are implementing these methods explicitly, so you need to cast your class to the base interface type first in order to call them:

// newContry is an entity of type Country

(_unitOfWork.countryRepository as IRepository<Country>).Add(newCountry)

Upvotes: 0

Related Questions