Debugowanie LINQ do SQL()

Naprawdę ciężko mi próbować debugować LINQ do SQL i zgłaszać zmiany.

Używam http://weblogs.asp.net/scottgu/archive/2007/07/31/linq-to-sql-debug-visualizer.aspx , który świetnie sprawdza się przy debugowaniu prostych zapytań.

Pracuję w klasie DataContext dla mojego projektu z następującym fragmentem z mojej aplikacji:

JobMaster newJobToCreate = new JobMaster();
newJobToCreate.JobID = 9999
newJobToCreate.ProjectID = "New Project";
this.UpdateJobMaster(newJobToCreate);
this.SubmitChanges();

Złapię kilka bardzo dziwnych WYJĄTKÓW, kiedy to uruchomię.SubmitChanges;

Index was outside the bounds of the array.

Stos trace goes places I cannot step in:

at System.Data.Linq.IdentityManager.StandardIdentityManager.MultiKeyManager`3.TryCreateKeyFromValues(Object[] values, MultiKey`2& k)
   at System.Data.Linq.IdentityManager.StandardIdentityManager.IdentityCache`2.Find(Object[] keyValues)
   at System.Data.Linq.IdentityManager.StandardIdentityManager.Find(MetaType type, Object[] keyValues)
   at System.Data.Linq.CommonDataServices.GetCachedObject(MetaType type, Object[] keyValues)
   at System.Data.Linq.ChangeProcessor.GetOtherItem(MetaAssociation assoc, Object instance)
   at System.Data.Linq.ChangeProcessor.BuildEdgeMaps()
   at System.Data.Linq.ChangeProcessor.SubmitChanges(ConflictMode failureMode)
   at System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode)
   at System.Data.Linq.DataContext.SubmitChanges()
   at JobTrakDataContext.CreateNewJob(NewJob job, String userName) in D:\JobTrakDataContext.cs:line 1119

Czy ktoś ma jakieś narzędzia lub techniki, których używa? Przegapiłem coś prostego?

EDIT : Nie jest to jednak żaden problem, ponieważ nie jest on w pełni funkcjonalny. http://referencesource.microsoft.com/netframework.aspx

EDIT2 : Zmieniłem na InsertOnSubmit zgodnie z sugestią sirrocco, wciąż dostając ten sam błąd.

EDIT3: Ja zaimplementowano sugestie sama, próbując zalogować wygenerowany SQL i złapać ChangeExceptoinException. Te sugestie nie rzucają więcej światła, Nigdy Nie będę generował SQL, gdy mój wyjątek jest wyrzucany.

EDIT4: Znalazłem odpowiedź, która działa dla mnie poniżej. To tylko teoria, ale naprawił mój obecny problem.

Author: ben, 2008-09-17

18 answers

Zawsze uważałem za przydatne wiedzieć dokładnie, jakie zmiany są wysyłane do DataContext w metodzie SubmitChanges ().

Używam DataContext.Metoda GetChangeSet () zwraca instancję obiektu ChangeSet, która zawiera 3 Ilisty tylko do odczytu obiektów, które zostały dodane, zmodyfikowane lub usunięte.

Możesz umieścić punkt przerwania tuż przed wywołaniem metody SubmitChanges i dodać Watch (lub Quick Watch) zawierający:

ctx.GetChangeSet();

Gdzie ctx jest bieżąca instancja DataContext, a następnie będziesz mógł śledzić wszystkie zmiany, które będą skuteczne w wywołaniu SubmitChanges.

 30
Author: CMS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-01 20:59:51

Po pierwsze, dziękuję wszystkim za pomoc, w końcu ją znalazłem.

Rozwiązaniem było zrzucenieplik dbml z projektu, Dodaj puste miejsce .plik dbml i przepełnij go tabelami potrzebnymi dla mojego projektu Z 'Server Explorer'.

Zauważyłem kilka rzeczy podczas tego:

  • istnieje kilka tabel w systemie nazwanym z dwoma wyrazami i spacją pomiędzy wyrazami, np. 'Job Master'. Kiedy wciągałem Ten stół z powrotem do ... plik dbml byłby Utwórz tabelę o nazwie "Job_Master", która zastąpi spację podkreśleniem.
  • w oryginale .plik dbml jeden z moich programistów przeszedł .pliku dbml i usunął wszystkie podkreślenia, w ten sposób 'Job_Master' stałby się' JobMaster ' wplik dbml. W kodzie możemy odnieść się do tabeli w bardziej, dla nas, standardowej konwencji nazewnictwa.
  • moja teoria jest taka, że gdzieś, tłumaczenie z "JobMaster" do "Job Master" podczas gdy został utracony podczas robienia projekcji, I ja ciągle wymyślałem błąd w tablicy poza granicami.

To tylko teoria. Jeśli ktoś mógłby to lepiej wyjaśnić, to chciałbym mieć tutaj konkretną odpowiedź.

 8
Author: ben,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-19 18:27:27

Moją pierwszą akcją debugowania byłoby spojrzenie na wygenerowany SQL:

JobMaster newJobToCreate = new JobMaster();
newJobToCreate.JobID = 9999
newJobToCreate.ProjectID = "New Project";
this.UpdateJobMaster(newJobToCreate);
this.Log = Console.Out; // prints the SQL to the debug console
this.SubmitChanges();

Drugim byłoby uchwycenie zmiany i przyjrzenie się szczegółom awarii.

  catch (ChangeConflictException e)
  {
    Console.WriteLine("Optimistic concurrency error.");
    Console.WriteLine(e.Message);
    Console.ReadLine();
    foreach (ObjectChangeConflict occ in db.ChangeConflicts)
    {
      MetaTable metatable = db.Mapping.GetTable(occ.Object.GetType());
      Customer entityInConflict = (Customer)occ.Object;
      Console.WriteLine("Table name: {0}", metatable.TableName);
      Console.Write("Customer ID: ");
      Console.WriteLine(entityInConflict.CustomerID);
      foreach (MemberChangeConflict mcc in occ.MemberConflicts)
      {
        object currVal = mcc.CurrentValue;
        object origVal = mcc.OriginalValue;
        object databaseVal = mcc.DatabaseValue;
        MemberInfo mi = mcc.Member;
        Console.WriteLine("Member: {0}", mi.Name);
        Console.WriteLine("current value: {0}", currVal);
        Console.WriteLine("original value: {0}", origVal);
        Console.WriteLine("database value: {0}", databaseVal);
      }
    }
  }
 6
Author: Sam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-18 10:35:32

Możesz utworzyć klasę częściową dla swojego DataContext i użyć metody Created lub what have you partial do Ustawienia dziennika w konsoli.out zawinięty w debugowanie # if.. to pomoże Ci zobaczyć zapytania wykonywane podczas debugowania dowolnego wystąpienia datacontext, którego używasz.

Znalazłem to przydatne podczas debugowania WYJĄTKÓW LINQ do SQL..

partial void OnCreated()
{
#if DEBUG
      this.Log = Console.Out;
#endif
}
 4
Author: Quintin Robinson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-18 04:30:34

Błąd, o którym mowa powyżej, jest zwykle spowodowany skojarzenia wskazujące w złym kierunku. Dzieje się to bardzo łatwo podczas ręcznego dodawania asocjacji do projektanta, ponieważ strzałki asocjacji w Projektancie L2S wskazują wstecz w porównaniu z narzędziami do modelowania danych.

Byłoby miło, gdyby rzucili bardziej opisowy wyjątek, a może zrobią to w przyszłej wersji. (Damien / Matt...?)

 2
Author: KristoferA,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-19 02:13:05

This is what I did

...
var builder = new StringBuilder();
try
{
    context.Log = new StringWriter(builder);
    context.MY_TABLE.InsertAllOnSubmit(someData);
    context.SubmitChanges();                
}
finally
{
    Log.InfoFormat("Some meaningful message here... ={0}", builder);
}
 2
Author: OscarRyz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-17 19:46:09

Prostym rozwiązaniem może być uruchomienie śledzenia w bazie danych i sprawdzenie zapytań uruchamianych przeciwko niej-oczywiście filtrowane, aby uporządkować inne aplikacje itp. dostęp do bazy danych.

To oczywiście pomaga tylko wtedy, gdy ominiesz wyjątki...

 1
Author: Per Hornshøj-Schierbeck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-17 19:29:24

VS 2008 ma możliwość debugowania przez. Net framework (http://blogs.msdn.com/sburke/archive/2008/01/16/configuring-visual-studio-to-debug-net-framework-source-code.aspx)

To chyba najlepsza opcja, możesz zobaczyć, co się dzieje i jakie są wszystkie właściwości w dokładnym momencie

 1
Author: Aaron Powell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-17 22:47:52

Dlaczego robisz UpdateJobMaster na nowej instancji ? Czy to nie powinno być InsertOnSubmit ?

JobMaster newJobToCreate = new JobMaster();
newJobToCreate.JobID = 9999
newJobToCreate.ProjectID = "New Project";
this.InsertOnSubmit(newJobToCreate);
this.SubmitChanges();
 1
Author: sirrocco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-18 04:26:08

To prawie na pewno nie będzie główna przyczyna wszystkich, ale napotkałem dokładnie ten sam wyjątek w moim projekcie - i odkryłem, że główną przyczyną było to, że wyjątek był wyrzucany podczas budowy klasy Bytów. Co dziwne, prawdziwy wyjątek jest "utracony" i zamiast tego manifestuje się jako argumentoutofrange wyjątek pochodzący z iteratora instrukcji Linq, która pobiera obiekt/y.

Jeśli otrzymujesz ten błąd i wprowadziłeś OnCreated lub OnLoaded metody na Twoim POCOs, spróbuj przejść przez te metody.

 1
Author: Mark,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-05 00:04:44

Hrm.

Biorąc WAG (Wild Ass Guess), wygląda na to, że LINQ-SQL próbuje znaleźć obiekt o id, który nie istnieje, oparty w jakiś sposób na utworzeniu klasy JobMaster. Czy istnieją klucze obce powiązane z tą tabelą, takie, że LINQ do SQL próbowałby pobrać instancję klasy, która może nie istnieć? Wydaje się, że ustawiasz ProjectID nowego obiektu na string - czy naprawdę masz id, które jest string? Jeśli próbujesz ustawić go na nowy projekt, będziesz trzeba utworzyć nowy projekt i uzyskać jego id.

Wreszcie, co robi UpdateJobMaster? Czy może to być coś takiego, że powyższe miałoby zastosowanie?

 0
Author: John Christensen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-17 19:49:43

W rzeczywistości przestaliśmy używać LINQ to SQL designer dla naszych dużych projektów i ten problem jest jednym z głównych powodów. Zmieniamy również wiele domyślnych wartości dla nazw, typów danych i relacji i co jakiś czas projektant utraci te zmiany. Nigdy nie znalazłem dokładnego powodu i nie mogę go wiarygodnie odtworzyć.

To, wraz z innymi ograniczeniami, spowodowało, że zrezygnowaliśmy z designera i zaprojektowaliśmy klasy ręcznie. Po tym jak przyzwyczailiśmy się do wzorów, w rzeczywistości jest to łatwiejsze niż korzystanie z projektanta.

 0
Author: amcoder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-10 17:07:09

Podobne pytanie zamieściłem dzisiaj tutaj: dziwny wyjątek LINQ (indeks poza granicami) .

To inny przypadek użycia - gdzie ten błąd występuje podczas SubmitChanges (), mój występuje podczas prostego zapytania, ale jest to również błąd indeksu poza zakresem.

Cross posting w tym pytaniu w przypadku, gdy połączenie danych w pytaniach pomaga dobry Samarytanin odpowiedzieć albo:)

 0
Author: Matt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:00:17

Sprawdź, czy wszystkie kolumny" klucz podstawowy " w dbml rzeczywiście odnoszą się do kluczy podstawowych w tabelach bazy danych. Miałem właśnie sytuację, w której projektant zdecydował się umieścić dodatkową kolumnę PK w dbml, co oznaczało, że LINQ do SQL nie mógł znaleźć obu stron klucza obcego podczas zapisywania.

 0
Author: Neil Barnwell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-10 10:15:29

Ostatnio natknąłem się na ten sam problem: to, co zrobiłem, było

Proce proces = unit.Proces.Single(u => u.ProcesTypeId == (from pt in context.ProcesTypes
                                                                         where pt.Name == "Fix-O"
                                                                         select pt).Single().ProcesTypeId &&
                                                                      u.UnitId == UnitId);

Zamiast:

Proce proces = context.Proces.Single(u => u.ProcesTypeId == (from pt in context.ProcesTypes
                                                                     where pt.Name == "Fix-O"
                                                                     select pt).Single().ProcesTypeId &&
                                                                  u.UnitId == UnitId);

Gdzie context był oczywiście obiektem DataContext, a "unit" instancją obiektu Unit, klasą danych z pliku dbml.

Następnie użyłem obiektu "proce" do Ustawienia Właściwości w instancji innego obiektu Klasy danych. Prawdopodobnie silnik LINQ nie mógł sprawdzić, czy właściwość, którą ustawiałem z obiektu "proce", była dozwolona w poleceniu INSERT, które miało być wytworzone przez LINQ aby dodać inny obiekt klasy danych do bazy danych.

 0
Author: craziac,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-20 08:48:09

Miałem ten sam błąd nie mówienia.

Miałem relację klucza obcego do kolumny tabeli, która nie była głównym kluczem tabeli, ale unikalną kolumną. Kiedy zmieniłem unikalną kolumnę, aby była głównym kluczem tabeli, problem zniknął.

Mam nadzieję, że to komuś pomoże!

 0
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-15 08:03:35

Zamieściłem moje doświadczenia z tym wyjątkiem w odpowiedzi na SO# 237415

 0
Author: Jim Counts,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:53:22

Skończyłem na tym pytaniu, próbując debugować mój LINQ ChangeConflictException. W końcu zdałem sobie sprawę, że problem polegał na tym, że ręcznie dodałem właściwość do tabeli w moim pliku DBML, ale zapomniałem ustawić właściwości takie jak Nullable (powinno być prawdziwe w moim przypadku) i typ danych Serwera

Mam nadzieję, że to komuś pomoże.

 0
Author: RuudvK,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-22 12:07:26