2011-10-13 8 views
7

Proszę mi powiedzieć, czy jest to przyzwoite podejście do usuwania podmiotu bez pobierania go, ponieważ mam identyfikator.Kod struktury obiektu Najpierw usuwanie za pomocą identyfikatora bez pobierania (styl ogólny)

Mam sklep rodzajowe z następującym Interface (ja tylko pokazać Kasuj):

public interface IStore : IReadOnlyStore 
{ 
    void Delete<TEntity>(TEntity entity) where TEntity : class, IEntity, new(); 
    void SaveChanges(); 
} 

I w konkretnej klasie zapas tego interfejsu, oto moja kasowania metoda:

public void Delete<TEntity>(TEntity entity) where TEntity : class, IEntity, new() 
{ 
    var obj = Ctx.Entry(entity); 
    if (obj.State == System.Data.EntityState.Detached) 
    { 
     Ctx.Set(typeof(TEntity)).Attach(obj.Entity); 
    } 
    Ctx.Set(typeof(TEntity)).Remove(obj.Entity); 
} 

i testowano zarówno newing się jednostki:

Store.Delete(new Foo() { Id = request.Entity.Id }); 

jak i pobierania, a następnie podmiotowi Calli ng usuń.

Poprzez debugowanie, mam pożądany wpływ na oba scenariusze.

Chcę tylko upewnić się, że jest to dobry projekt i że nie ma żadnych skutków ubocznych w tym podejściu.

Dla porównania, Ctx to sam DbContext.

Dzięki.

Odpowiedz

3

To dobry projekt i nie ma skutków ubocznych :) (IMHO)

Dwie uwagi:

  • Zastanawiam się, czy można uprościć metody Delete przez:

    public void Delete<TEntity>(TEntity entity) 
        where TEntity : class, IEntity, new() 
    { 
        Ctx.Entry(entity).State = EntityState.Deleted; 
    } 
    

    Mam nadzieję, że ustawienie stanu na Deleted zostanie dołączone automatycznie, jeśli podmiot nie jest jeszcze przyłączony. Ale nie jestem pewien, czy to działa. (Daj mi znać, czy działa w przypadku dołączonych i odłączonych scenariuszy (jeśli powinieneś to przetestować).)

  • Jeśli masz na uwadze optymalizację wydajności (unikanie ładowania obiektów), nie zapominaj, że jeśli istnieje wiele obiekty do usunięcia w kontekście, SaveChanges będzie nadal wysyłać jedną instrukcję DELETE na jednostkę do bazy danych. Usuwanie zbiorcze z EF jest dość przerażające w działaniu i jest terenem, w którym powrót do instrukcji SQL (DELETE ... WHERE ... IN ... wiele identyfikatorów ...) czasami ma sens (jeśli wydajność ma znaczenie).

+0

Dzięki za opinie zwrotne. Próbowałem twojej sugestii, ale zabiło to ponad 50% moich testów jednostkowych. Typowy błąd wydaje się następujący: Wystąpił błąd podczas zapisywania jednostek, które nie ujawniają właściwości klucza obcego w swoich relacjach. Właściwość EntityEntries zwróci wartość null, ponieważ nie można zidentyfikować pojedynczej encji jako źródła wyjątku. Obsługa wyjątków podczas zapisywania może być łatwiejsza dzięki ujawnieniu właściwości klucza obcego w typach jednostek. – Forest

+0

Zobacz szczegóły wyjątku InnerException. ---> System.Data.UpdateException: Relacja z zestawu "Foo_Siblings" AssociationSet znajduje się w stanie "Deleted". Biorąc pod uwagę ograniczenia wielokrotności, odpowiedni "Foo_Siblings_Target" musi również znajdować się w stanie "Usunięte". – Forest

Powiązane problemy