Wątek zablokowany 2014-11-06 14:16 przez somekind.

Membership i repozytorium generyczne C#

0

Cześć!

Implementuje do swojego projektu repozytorium generyczne. Mam taki dziwny problem. Bo chcąc skorzystać z metody

context.Set<TEntity>() IDE krzyczy po mnie że nie ma takiej metody a powinna być...

Gdzie muszą ją zadeklarować? Czy może coś dograć?

 public class GenericRepository<TEntity> : IGenericRepository<TEntity> where TEntity: class
    {
        internal ApplicationDbContext Context;
        internal DbSet<TEntity> Entities; 

        public GenericRepository(ApplicationDbContext context)
        {
            this.Context = context;
            this.Entities = context.Set<TEntity>(); // nie ma tej metody SET
        }
}

Mam coś takiego i chodzi mi o to co dzieje w konstruktorze, i później będzie wykorzystywane w metodach.

Otrzymuje jak na to najade: "Cannot resolve symbol Set"

Chyba, że chodzi o to, że zamiast ApplicationDbContext musze korzystać z DbContext bo wtedy dziala :P

0

To jak wygląda ApplicationDbContext po czym dziedziczy?

0
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>, IDisposable

To domyślny DbContext membershipa ASP MVC, tam generuje dodatkowe modele swoich tabel w podejściu Code First.

Natomiast w generycznym repozytorium wykorzystałem sam DbContext i pojawila sie ta moja metoda Set<>

using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using Test.Models;
using Antlr.Runtime.Misc;

namespace AdamKawikSklepInternetowy.Repository
{
    public class GenericRepository<TEntity> : IGenericRepository<TEntity> where TEntity : class
    {
        private readonly DbContext _context;

        public GenericRepository(DbContext context)
        {
            this._context = context;
        }


        public TEntity Get(Func<TEntity, bool> predicate)
        {
            return _context.Set<TEntity>().FirstOrDefault(predicate);
        }

        public TEntity Get(int id)
        {
            return _context.Set<TEntity>().Find(id);
        }

        public IQueryable<TEntity> GetMany()
        {
            return _context.Set<TEntity>();
        }

        public IQueryable<TEntity> GetMany(Func<TEntity, bool> predicate)
        {
            return _context.Set<TEntity>().Where(predicate).AsQuerable();
        }

        // dodaj jeden byt
        public TEntity Insert(TEntity entity)
        {
            return _context.Set<TEntity>().Add(entity);
        }

        // dodaj wiele bytow
        public IEnumerable<TEntity> Insert(params TEntity[] entities)
        {
            return _context.Set<TEntity>().AddRange(entities);
        }

        // skasuj jeden byt
        public TEntity Delete(TEntity entity)
        {
            return _context.Set<TEntity>().Remove(entity);
        }

        public IEnumerable<TEntity> Delete(params TEntity[] entities)
        {
            return _context.Set<TEntity>().RemoveRange(entities);
        }
    }
}

I jest teraz problem z tym predicate :P

user image

1

Przecież masz napisane w opisie błędu, w czym rzecz. Korzystasz z Antlr.Runtime.Misc.Func zamiast System.Func.

0

Jeszcze mam takie pytanie. Jak zrobić sobie metodę Update() w repozytorium generycznym?

IGenericRepository

 
  TEntity Update(TEntity entity);
  IEnumerable<TEntity> UpdateMany(params TEntity[] entities);

GenericRepository.cs

 
   public TEntity Update(TEntity entity)
        {
            throw new NotImplementedException();
        }

        public IEnumerable<TEntity> Update(params TEntity[] entities)
        {
            throw new NotImplementedException();
        }

Jak je zaimplementowac bo nie mam jakoś pomysłu?

Bo potem wykorzystuje te repozyteria i UoW w moich serwisach.

0

Czy takie coś na voidzie mi wystarczy?

  public void Update(TEntity entity)
        {
            _context.Entry(entity).State = EntityState.Modified;
        }
0

Spróbuj jeszcze raz, tym razem EDYTUJ posty zamiast pisać nowe. Nie mam czasu na ciągłe scalanie. ;]

1 użytkowników online, w tym zalogowanych: 0, gości: 1