implementacja interfejsu generycznego repozytorium

0

Mam problem z implementacją generycznego interfejsu repozytorium - konkretnie z metodą Update. Mój interfejs wygląda jak poniżej:
public interface IRepository<T>
{
void Create(T t);
void Update(T t);
void Delete(T t);
IQueryable<T> Get();
}

implementacja interfejsu :
public class Repository<T> : IRepository<T> where T : EntityObject
{
private MyEntities Context = new MyEntities();

    public void Create(T t)
    {
        if (t == null)
        {
            throw new ArgumentNullException("entity");
        }
        Context.CreateObjectSet<T>().AddObject(t);
        Context.SaveChanges();
    }

    public void Update(T t)
    { 
        if (t == null)
        {
            throw new ArgumentNullException("entity");
        }

        Context.CreateObjectSet<T>().ApplyCurrentValues(t);            
        Context.SaveChanges();
    }

    public void Delete(T t)
    {
        if (t == null)
        {
            throw new ArgumentNullException("entity");
        }
        Context.CreateObjectSet<T>().DeleteObject(t);
        Context.SaveChanges();
    }

    public IQueryable<T> Get()
    {
        return Context.CreateObjectSet<T>();
    }
}

działa wszystko z wyjątkiem metody Update (argument t się przekazuje, ale samo Context.CreateObjectSet<T>().ApplyCurrentValues(t) nie wprowadza żadnych zmian).
Nie zwraca ani błędy, ani wyjątku.
Ma ktoś może pomysł co z tym zrobić?

0

Raz że ApplyCurrentValues działa tylko dla wartości skalarnych.
Dwa czy na pewno obiekt który przekazujesz do Update jest w ObjectContext?

0

Przy updacie zazwyczaj robiło się tak, że pobierało się jeden obiekt z bazy danych, jakbyś normalnie "get" robił prawdopodobnie za pomocą linq.Single() / FirstOrDefault() , a następnie do tego obiektu z bazy trzeba było przypisać wartości z obiektu edytowanego. Następnie wywołujesz SaveChanges(). Czyli ciężko zaimplementować interface w przypadku updatu, bo teoretycznie update dla każdej klasy będzie inny.

0

A ta metoda jest zaimplementowana? Co to jest MyEnities? No i czy ta całość działa w jakiejś sesji, czy Update ma co updateować?

0

możesz zrobić attach i ustawić stan na zmodyfikowany, zamiast ApplyCurrentValues

0
odp napisał(a)

Przy updacie zazwyczaj robiło się tak, że pobierało się jeden obiekt z bazy danych, jakbyś normalnie "get" robił prawdopodobnie za pomocą linq.Single() / FirstOrDefault() , a następnie do tego obiektu z bazy trzeba było przypisać wartości z obiektu edytowanego. Następnie wywołujesz SaveChanges(). Czyli ciężko zaimplementować interface w przypadku updatu, bo teoretycznie update dla każdej klasy będzie inny.

Tak właśnie wcześniej robiłam wcześniej, ale teraz postanowiłam zastosować generyczny interfejs i repozytorium z którego korzystają servces. Wszystko jest fajnie dopóki nie potrzebuje edytować obiektu. I w tym momencie mam problem z dostaniem się do propertisów pojedynczego obiektu T.

0
massther napisał(a)

możesz zrobić attach i ustawić stan na zmodyfikowany, zamiast ApplyCurrentValues

Próbowałam, ale też w bazie nic się nie zmienia

0
massther napisał(a)

Raz że ApplyCurrentValues działa tylko dla wartości skalarnych.

ok :) to chyba sporo wyjaśnia :)

0
kbkkmm napisał(a)
massther napisał(a)

możesz zrobić attach i ustawić stan na zmodyfikowany, zamiast ApplyCurrentValues

Próbowałam, ale też w bazie nic się nie zmienia

i już wiem czemu się nic nie zmieniało...
public void Update(T t)
{
if (t == null)
{
throw new ArgumentNullException("entity");
}
var ctx = Context.CreateObjectSet<T>() as ObjectContext;
if (ctx == null) return; //tępo skopiowałam skądś tą linijkę..., a akurat ctx jest u mnie nullem...
ctx.Attach(t);
ctx.ObjectStateManager.ChangeObjectState(t, EntityState.Modified);
Context.SaveChanges();
}

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