2012-05-24 13 views
11

Mam problem z MultiMaps w eleganckich próbach podziału na kolumnę zawierającą NULL. Wydaje się, że Dapper nie tworzy instancji obiektu, a moja funkcja odwzorowania otrzymuje obiekt zamiast obiektu.Dapper MultiMap nie działa z splitOn z wartością NULL

Oto mój nowy test:

class Product 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
     public Category Category { get; set; } 
    } 
    class Category 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
     public string Description { get; set; } 
    } 
    public void TestMultiMapWithSplitWithNullValue() 
    { 
     var sql = @"select 1 as id, 'abc' as name, NULL as description, 'def' as name"; 
     var product = connection.Query<Product, Category, Product>(sql, (prod, cat) => 
     { 
      prod.Category = cat; 
      return prod; 
     }, splitOn: "description").First(); 
     // assertions 
     product.Id.IsEqualTo(1); 
     product.Name.IsEqualTo("abc"); 
     product.Category.IsNotNull(); 
     product.Category.Id.IsEqualTo(0); 
     product.Category.Name.IsEqualTo("def"); 
     product.Category.Description.IsNull(); 
    } 

Linia, która nie jest product.Category.IsNotNull(); ze względu na fakt, że cat przekazywane do funkcji mapowania null.

Dodałem także tej metody twierdzą, Klasa:

public static void IsNotNull(this object obj) 
{ 
    if (obj == null) 
    { 
     throw new ApplicationException("Expected not null"); 
    } 
} 
+0

Chciałbym pomóc, zadzwoniłem do Paula na twitterze, który pisze github dla Windows. Wiem, że ciężko pracują, aby rozwiązać ten problem z kreską. –

+0

@SamSaffron - dziękuję za komentarz. Jeśli dasz mi znać, kiedy już to załatwisz, mogę wprowadzić zmiany. Możesz jednak skopiować test z mojego posta - jest całkiem oczywiste, gdzie powinny nastąpić zmiany ;-) PS. Uwielbiam github dla Windows. Daj mi znać, jeśli mógłbym pomóc w testowaniu. –

+2

Wysłałem wiadomość PR dla Dappera, która powinna spowodować, że problemy z kończeniem linii znikną.Daj mi znać, czy nadal się pojawiają. Morał z historii: * Kopiuj-wklej [ten plik] (https://gist.github.com/2802523#file_the+original+guy+used+autocrlffalse) jako ".gitattributes", jeśli oryginalny facet użył 'autocrlf = false '* Kopiuj-wklej [ten plik] (https://gist.github.com/2802523#file_the+original+guy+used+autocrlftrue) jako' .gitattributes' jeśli użył 'autocrlf = true' –

Odpowiedz

14

to "by-design" chociaż byłoby OK, aby go ponownie.

W szczególności takie zachowanie pomaga lewemu złączeniu. Weź to na przykład:

cnn.Query<Car,Driver>("select * from Cars c left join Drivers on c.Id = CarId", 
    (c,d) => {c.Driver = d; return c;}) 

Problem jest to, że jeśli pozwolimy się „koc” stworzenie Driver obiektu, każdy Car będzie mieć Driver nawet te, gdzie dołączyć nieudane.

Aby obejść problem, możemy przeskanować cały podzielony segment i upewnić się, że wartości ALL wynoszą NULL przed odwzorowaniem obiektu NULL. Będzie to miało bardzo niewielki wpływ na multi-mapper.

Aby obejść w Twoim przypadku, można wstawić kolumnę zastępczą:

var sql = @"select 1 as id, 'abc' as name, '' as split, 
      NULL as description, 'def' as name"; 
    var product = connection.Query<Product, Category, Product>(sql, (prod, cat) => 
    { 
     prod.Category = cat; 
     return prod; 
    }, splitOn: "split").First(); 
+1

Dzięki za odpowiedź - Rozumiem co masz na myśli. Zaimplementowałem podobne obejście w moim projekcie przy użyciu klucza podstawowego tabeli 'Drivers'. Pusta kolumna zastępcza wymusza tworzenie obiektów dla każdego wiersza, nawet te, które nie zakończyły się lewym łączeniem, więc aby znaleźć brakujące rekordy, musiałbym mimo wszystko sprawdzić wszystkie właściwości w funkcji mapowania. Byłoby świetnie, gdyby Dapper poradził sobie z tym w sposób ogólny, zamiast sprawdzać wiele właściwości dla 'NULL' na wielu mapach. Może jakiś flag poprawić PEFR? Bardziej opisowy przykład (http://code.google.com/p/dapper-dot-net/) również byłby mile widziany. –

+1

Po prostu wpadłem na ten problem i nie zdawałem sobie sprawy z tego zachowania z wyprzedzeniem. Byłbym zainteresowany co najmniej flagą 'splitOnNull: true', aby uniknąć tego problemu. Do tego czasu będzie musiał użyć kolumn zastępczych. –

+0

Czy ten przykład nie jest wadliwy, ponieważ masz dwukrotnie kolumnę o nazwie "nazwa"? –

1

Dla wszystkich, którzy chcą wizualizacja:

Dapper podziały według ostatniego równego nazwy kolumny:

enter image description here

Zamieńmy lokalizację kolumn:

enter image description here

zerowy problemów:

enter image description here

Zamienione kolumna zerowy:

enter image description here

Spliton do ratowania:

enter image description here

Powiązane problemy