Laden...

Update mit Dapper und Repository pattern

Letzter Beitrag vor einem Jahr 4 Posts 487 Views
Update mit Dapper und Repository pattern

Hallo,

um ein neues Projekt ordentlich zu gestalten arbeite ich mich nun in DApper und Repository pattern ein.
Das Abrufen der Daten von der DB hat auch schon prima geklappt.
Nun hänge ich beim Update.


public interface IArtikelRepository
    {
        IEnumerable<Artikel> GetAllArtikel();
        Artikel GetById(int ArtikelIdent);
        void Insert(Artikel artikel);
        void UpdateArtikel(Artikel artikel);
        void Delete(int ArtikelIdent);
        void Save();
    }


public void UpdateArtikel(Artikel artikel)
        {
            using (IDbConnection db = new MySqlConnection(AppConnection.ConnectionString))
            {
                string q = @"UPDATE tblartikel SET Name = @Name WHERE Id = @Id";

                if (db.State == ConnectionState.Closed)
                    db.Open();
                db.ExecuteScalar<Artikel>(q, artikel);
             
            }
            throw new NotImplementedException();
        }

Und der Aufruf:


private void btnSpeichern_Click(object sender, EventArgs e)
        {
            artikelRepository.UpdateArtikel(a);
        }

Das Update wird zwar ausgeführt - also die Daten geändert - aber ich erhalte folgende Fehlermeldung:

Fehlermeldung:
System.NotImplementedException: "Die Methode oder der Vorgang ist nicht implementiert."

Was ist bzw. mache ich falsch?

Hallo,

siehe Zeile 12 im Codeblock #2.

LG

Oh, total übersehen, dass das ja immer ausgeführt wird! DANKE!

Du machst die gleichen Fehler wie in Deinem anderen Thema, was die Verbindungsverwaltung und Implementierung angeht.
Schau Dir nochmal an, wie der Repository Pattern funktioniert, bevor Du da alles implementierst.

Auch das Interface sollte eigentlich anders aussehen, eher so


public interface IArtikelRepository
{
        Task<IQueryable<Artikel>> GetAll();
        Task<Artikel?> Get(int id);
        Task<Artikel> Add(ArtikelEntity entity);
        Task<Artikel> Update(ArtikelEntity entity);
        Task<Artikel?> Delete(int id);
}

Warum? I.d.R verwendet man Vererbungsmechanismen.


public interface IBaseRepository<T> where T: BaseEntity
{
        Task<IQueryable<T>> GetAll();
        Task<T?> Get(int id);
        Task<T> Add(T entity);
        Task<T> Update(T entity);
        Task<T?> Delete(int id);
}
public interface IArtikelRepository : IBaseRepository<ArtikelEntity> { }

Der Sinn vom Repository Pattern ist: Zentralisierung von DB Operationen -> DRY. Das wäre bei Deinem anderen Thema kein Performance, sonder nur Strukturbenefit (was viel wert ist).
Das für jede Entität neu zu schreiben, wäre redundanter Code.

Die Verbindungsverwaltung ist nicht Teil der Repositories. Das ist Aufgabe des Contexts, wobei dieser in das Repository übergeben wird.
Das ist bezogen auf Dein anderes Thema auch der konkrete Benefit, der sich auch aktiv auf die Performance auswirkt: der Kontext existiert nur ein mal und wird geshared.
Was Du machst ist für jede DB Operation eine neue SQL Verbindung und einen neuen Kontext aufzubauen -> wirst exakt das gleiche Performance Problem erneut bekommen.
Das richtig zu machen wäre daher schon förderlich.

Also bevor Du da weiter implementierst: schau nochmal das Prinzip, das Ziel, die Idee des Patterns an.