7

Przykład: Załóżmy, że mam te trzy klasy. Foo jest prawidłową jednostką Entity Framework z DbSet, ale chcę, aby mój DbContext EF był nieświadomy Bar i Baz, ponieważ oznaczyłem właściwość Foo's Bar z podanym atrybutem SerializedColumn. Stosując ten atrybut, chcę, aby EF serializował instancję paska z jego Bazami w jedno pole ciągu i przezroczyście deserializował Bar do obiektu Bar, gdy Foo jest zmaterializowane przez EF.Utrwalanie i pobieranie seryjnej właściwości encji za pomocą kodu Entity Framework 6.1 pierwszy kod

public class Foo 
{ 
    public Guid Id { get; set; } 
    [SerializedColumn] 
    public Bar Bar { get; set; } 
    // .. 
} 

public class Bar 
{ 
    public string Name { get; set; } 
    public Baz[] Baz { get; set; } 
    // .. 
} 

public class Baz 
{ 
    public string Name { get; set; } 
    // .. 
} 

Więc kolumny tabeli Foo wyglądałby następująco:

[Id] [uniqueidentifier] NOT NULL 
[Bar] [nvarchar](max) NULL 

I kiedy kwerendy Foo wrócę jednej z posesji Bar już rozszeregować. Kiedy wstawiam lub aktualizuję Foo właściwość zostanie spersonalizowana przez EF bez konieczności myślenia o tym. Jedyne co muszę zrobić, to dodać atrybut atrybutu [SerializeColumn] do właściwości.

Cele:

  • Ja nie koniecznie szukasz pełnego rozwiązania dmuchanego (chociaż chciałbym go przyjąć), ale dla wytycznych dotyczących gdzie wskoczyć do rurociągu EF i jak to zrobić. TO ZNACZY. jakie klasy EF, konfiguracje, konwencje itp. muszę wziąć pod uwagę?
  • Chcę, aby migracje były generowane tak, jak można by oczekiwać. Co oznacza, że ​​nie chcę, aby moja właściwość Bar zmieniła się w pole "Bar_Id", które wskazuje na tabelę "Bar". Zamiast tego chcę pole "Bar" nvarchar(max), które będzie zawierać serializowaną wersję obiektu Bar. Jeśli to po prostu nie jest możliwe, powiedz to w swojej odpowiedzi.

Uwagi:

  • Pomysł ten przyszedł po obejrzeniu wideo Building Applications with Entity Framework 6 przez Rowana Millera.
  • ComplexType nie zaspokaja moich potrzeb. Potrzebuję głębokiej serializacji i nie muszę być w stanie filtrować ani sortować żadnych właściwości tego, co zostało serializowane.
  • Mam zamiar serializować z biblioteką Jetsona Newtonsoft, ale jak serializacja się nie ma naprawdę znaczenia.
+0

coś takiego? http://stackoverflow.com/questions/14779740/can-i-embed-an-object-in-an-ef-entity-serialize-on-save-deserialize-on-access – MutantNinjaCodeMonkey

+0

@MutantNinjaCodeMonkey Zrobiłem to w przeszłość i to działa, ale staram się, aby upór był całkowicie przejrzysty. Jest to tylko jedna właściwość 'Bar' z wprowadzonym' SerializeColumnAttribute' i żadna właściwość 'BarSerialized'. –

+2

Na pewno nie jest to możliwe w EF6. To, czego naprawdę potrzebujesz, to konwerter typu klienta.Ta funkcja jest [planowana] (https://github.com/aspnet/EntityFramework/issues/242) dla EF7, ale jeszcze nie została wdrożona. – DavidG

Odpowiedz

9

Jedynym rozwiązaniem jest to,

public class Foo 
{ 
    public Guid Id { get; set; } 

    // Not Mapped attribute will make EF 
    // ignore this property completely 
    [NotMapped] 
    public Bar BarObject { 
     get; 
     set; 
    } 

    public string Bar{ 
     get{ 
      return JsonConvert.Serialize(BarObject); 
     } 
     set{ 
      BarObject = JsonConvert.Deserialize<BarObject>(value); 
     } 
    } 
} 

Updated jak za sugestią przez @zds

+0

Dziękuję Ci Akash, ale dałem nagrodę @bubi, ponieważ odpowiedział jako pierwszy z zasadniczo tą samą odpowiedzią co ty, choć trochę mniej szczegółową. Gdybym mógł, podzieliłbym nagrodę pomiędzy dwiema odpowiedziami. –

+1

Czy lepiej jest przenieść logikę serializacji do właściwości "public string Bar". Nie serializować i deserializować cały czas, kiedy coś zmienia. Czy może czegoś brakuje? – zds

1

Nie można tego zrobić bez modyfikowania EF. Z EF 6 Myślę, że kilka osób zrobiło to z podkładem tekstowym i pewnymi ograniczeniami (dzieci w barze i barze nie mają dostępu do trwałej własności EF lub potrzebujesz innej pracy po deserializacji).

+0

Byłbym dobrze z ograniczeniami, które pochodzą z pola tekstowego w bazie danych (bez filtrowania, projekcje w bazie danych, itp.). Lub przez pole tekstowe, czy odwołujesz się do używania dwóch właściwości, jednej oznaczonej [NotMapped], która jest odszyfrowaną wersją zaszyfrowanej właściwości, którą EF będzie trwał? –

+0

Dla pola wsparcia mam na myśli dwie właściwości, jedną oznaczoną [NotMapped], która jest odszyfrowaną wersją zaszyfrowanej właściwości, którą EF będzie się utrzymywać. – bubi

+0

Cóż, nie ma nic złego w kopiowaniu właściwości, jeśli to jest to, do czego to się należy. Dzięki @ bubi zamierzam pozwolić, aby ta nagroda pozostała dłużej, aby zobaczyć, czy ktokolwiek może dodać pomocne informacje. –