2010-11-03 13 views
24

Za każdym razem, gdy podejmuję próbę TWORZENIA konkretnej jednostki ... chcę tylko wiedzieć, jak powinienem ustalić przyczynę.Jak rozwiązać problem "Aktualizacja wsadowa zwróciła nieoczekiwaną liczbę wierszy z aktualizacji, rzeczywista liczba wierszy: 0, oczekiwano: 1" problem?

Używam automatyzacji Fluent NHibernate, więc być może nie ustawiłem konwencji odpowiednio i/lub muszę przesłonić coś w jednym lub więcej plików mapujących. Przeszedłem przez kilka postów w sieci dotyczących tego problemu i trudno mi było dokładnie określić, dlaczego tak się dzieje w moim przypadku.

Obiekt, który zapisuję, jest bardzo prosty. Jest to obiekt "Person", który odwołuje się do encji "Company" i ma kolekcję encji "Address". AKTUALIZACJE działają poprawnie na istniejących obiektach Person znajdujących się już w bazie danych.

Sugestie?

Thanks -wg

Odpowiedz

25

Błąd oznacza, że ​​instrukcja SQL INSERT jest wykonywany, ale ROWCOUNT zwracane przez SQL Server po zjazdowych wynosi 0, a nie 1, jak oczekiwano.

Istnieje kilka przyczyn, od niepoprawnych odwzorowań, do wyzwalaczy UPDATE/INSERT, które mają wyłączone rowcount.

Twój najlepszy beat to profilowanie instrukcji SQL i sprawdzanie, co się stanie. Aby to zrobić, należy włączyć nHibernate sql logging lub użyć profilera sql. Po uzyskaniu kodu SQL możesz znać przyczynę, jeśli nie, spróbuj uruchomić SQL ręcznie i zobacz, co się stanie.

Proponuję również opublikować swoje mapowanie, ponieważ pomoże to użytkownikom wykryć wszelkie problemy.

+1

Yup. W moim przypadku używam frameworku SharpArchitecture, który domyślnie niezapisane wartości dla pola "Id" wynosi zero ... zamiast -1, jak byłem przyzwyczajony do używania przez lata. Próbowałem przesłonić to w mojej konfiguracji automatu, a nawet w niestandardowej klasie mapowania ... ale nadal ustawia ją na 0. – wgpubs

+1

Tak wypróbowałeś to: Id (a => a.Id). UnnsavedValue (0); Jeśli nadal masz problemy i chcesz, abym rzucił okiem, dodaj wynikowy kod SQL i swoje mapowanie do swojego pytania. – Iain

+1

Mam ten problem, ponieważ do zbioru dodawano obiekt zerowy, a następnie wykonywany był zapis. – m4tt1mus

9

Może się to zdarzyć, gdy wyzwalacze wykonają dodatkowe kwerendy DML (modyfikacja danych), które mają wpływ na liczbę wierszy. Moje rozwiązanie polegało na dodaniu następujących elementów u góry mojego wyzwalacza:

SET NOCOUNT ON; 
0

Może to nastąpić z powodu automatycznego przyrostu klucza podstawowego. Aby rozwiązać ten problem, nie wstawiaj wartości auto increment z zestawem danych. Wstaw dane bez klucza podstawowego.

0

Podczas kierowania widoku z wyzwalaczem INSTEAD OF może być niemożliwe uzyskanie prawidłowej liczby wierszy. Po zagłębianiu się w źródło dowiedziałem się, że można utworzyć niestandardowy persister, który sprawia, że ​​NHibernate ignoruje sprawdzanie liczby.

public class SingleTableNoResultCheckEntityPersister : SingleTableEntityPersister 
{ 
    public SingleTableNoResultCheckEntityPersister(PersistentClass persistentClass, ICacheConcurrencyStrategy cache, ISessionFactoryImplementor factory, IMapping mapping) 
     : base(persistentClass, cache, factory, mapping) 
    { 
     for (int i = 0; i < this.insertResultCheckStyles.Length; i++) 
     { 
      this.insertResultCheckStyles[i] = ExecuteUpdateResultCheckStyle.None; 
     } 

     for (int i = 0; i < this.updateResultCheckStyles.Length; i++) 
     { 
      this.updateResultCheckStyles[i] = ExecuteUpdateResultCheckStyle.None; 
     } 

     for (int i = 0; i < this.deleteResultCheckStyles.Length; i++) 
     { 
      this.deleteResultCheckStyles[i] = ExecuteUpdateResultCheckStyle.None; 
     } 
    } 
} 
+0

Witam, czy mógłbyś dać mi znać, jak używasz tego persisty? –

Powiązane problemy