2011-02-28 7 views
9

Buduję ORM przy użyciu Entity Frameworks 4.0 (CTP5) we wzorcu Model-First. Niektóre z moich jednostek mają złożone własności (drzewa obiektów), które nie muszą być obiektami ORM - są one interesujące tylko dla systemów zaplecza serwerów korzystających z tej bazy danych, a nie dla klientów korzystających z tej bazy danych.Jak określić typ danych XML serwera SQL w modelu Entity Frameworks 4.0?

Mogę tylko serializować drzewo obiektów właściwości do ciągu i przechowywać go w DB jako ciąg znaków, ale typ danych SQL Server XML jest naprawdę atrakcyjny. Możliwość inteligentnego przeszukiwania zawartości danych XML byłaby bardzo przyjemna.

Jednak nie widzę sposobu, aby określić, że chcę typ danych XML w Visual Studio Entity Modeler.

Czy jest to jedyny sposób, aby to zrobić, aby określić pola łańcuchowe w modelu, wyrenderować DDL, a następnie zmodyfikować DDL, aby zmienić pola łańcuchowe na pola XML? To wydaje się strasznie kruche i pisać raz, nigdy się nie zmieniaj. Czy istnieje lepszy sposób?

+2

BTW, to już nie "SQL XML". To tylko wbudowana część SQL Server. –

+0

Nie pomoże ci to na krótką metę, ale możesz zagłosować na to: http://data.uservoice.com/forums/72025-entity-framework-feature-suggestions/suggestions/1051783-xml-data-type -support –

Odpowiedz

8

W "Entity Framework 4.0 Recipes" Larry Tenny i Zeeshan Hirani twierdzą, że typy danych XML nie są po prostu obsługiwane przez EF 4.0.

Oferują obejście, które polega na uczynieniu właściwości typu string na klasie encji wygenerowanej przez model prywatny i utworzenia nowej właściwości (w swojej częściowej klasie klasy encji) w celu zwrócenia XElement z wewnętrznego właściwość ciąg:

public partial class Candidate 
{ 
    private XElement candidateResume = null; 

    public XElement CandidateResume 
    { 
     get 
     { 
      if (candidateResume == null) 
      { 
       candidateResume = XElement.Parse(this.Resume); 
       candidateResume.Changed += (s,e) => 
       { 
        this.Resume = candidateResume.ToString(); 
       } 
      } 

      return candidateResume; 
     } 

     set 
     { 
      candidateResume = value; 
      candidateResume.Changed += (s,e) => 
      { 
       this.Resume = candidateResume.ToString(); 
      } 
      this.Resume = value.ToString(); 
     } 
    } 
} 

Tworzenie właściwość shadow żądanego typu XML jak to powinno działać, ale konwersja między struny i XML na każdej zmianie pierwotnego nieruchomości smyczkową (Resume), a nowy obiekt cienia (CandidateResume) jest dość drogi.

Jeśli ktoś ma lepsze pomysły, nadal jestem otwarty na sugestie.

0

Znalazłem sposób na zamaskowanie faktu, że Entity Framework odwzorowuje właściwość XML na właściwość String, używając ukrytego typu złożonego. Chociaż wymaga to zmodyfikowania każdej jednostki, której dotyczy problem, przed zapisaniem jej w bazie danych. Z grubsza wykorzystuję fakt, że Entity Framework pozwala na określenie typów wewnętrznych w pliku .csdl.

Mam opisuje moje podejście w szczegółach bitowym tutaj: .net ORM Comparison

ja też właśnie zainstalowałeś CTP5 aby przyjrzeć podejścia kodu, po pierwsze, aby zobaczyć, czy to samo podejście może być stosowane bez posiadania Plik .edmx lub .csdl. Będę edytować tę odpowiedź, jeśli znalazłem inny sposób.

+0

Brzmi obiecująco! – dthorpe

+0

Nie miałem szczęścia w moim pierwszym wystąpieniu. Proste, ponieważ nie mogłem znaleźć sposobu na pracę z typem złożonym bezpośrednio. Jeśli mógłbyś pokazać mi, co masz do tej pory, lub jakie podejście do pierwszego kodu podjąłeś (byłem zdezorientowany z DbContext, DbSet itp.), Mógłbym po prostu "w to wciągnąć". –

Powiązane problemy