/ / Jak określić typ danych XML serwera SQL w modelu Entity Frameworks 4.0? - .net, xml, entity-framework, entity-framework-4

Jak określić typ danych XML serwera SQL w modelu Entity Frameworks 4.0? - .net, xml, entity-framework, entity-framework-4

Buduję ORM przy użyciu Entity Frameworks 4.0 (CTP5) we wzorcu Model-pierwszy. Kilka moich obiektów ma złożone własności (drzewa obiektów), które nie muszą być jednostkami 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.

Mogę tylko serializować drzewo obiektów właściwościaż do napisu 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ę żadnego sposobu, aby określić, że chcę typ danych XML w Visual Studio Entity Modeler.

Jest to jedyny sposób, aby to zrobić, aby określićciąg pól w modelu, wyślij DDL, a następnie zmodyfikuj DDL, aby zmienić pola ciągu na pola XML? To wydaje się strasznie kruche i pisać raz, nigdy się nie zmieniaj. Czy istnieje lepszy sposób?

Odpowiedzi:

9 dla odpowiedzi № 1

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 ma na celu uczynieniewłaściwość typu string na klasie encji wygenerowana przez model private i utwórz nową właściwość (w swojej własnej klasie częściowej klasy encji), aby zwrócić obiekt XElement z wewnętrznej właściwości string:

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ści shadow pożądanego XMLTyp taki powinien zadziałać, ale konwersja pomiędzy ciągiem znaków i XML przy każdej zmianie oryginalnej właściwości ciągu (Resume) i nowej właściwości shadow (CandidateResume) jest dość kosztowna.

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


0 dla odpowiedzi nr 2

Znalazłem sposób na zamaskowanie faktu, że EntityFramework 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.

Poniżej opisuję nieco moje podejście: Porównanie .NET ORM

Właśnie zainstalowałem CTP5, żeby się przyjrzećpodejście oparte na pierwszym kodzie, aby sprawdzić, czy można zastosować to samo podejście bez pliku .edmx lub .csdl. Zmienię tę odpowiedź, jeśli znajdę inny sposób.