2016-10-14 7 views
0

Es gibt etwas, das ich nicht ganz verstehe, wenn Linq zu SQL- und XML-Serialisierung unter einige meiner Objekteigenschaften verwendet.C# - Verwenden von Linq zu SQL mit XML-Serialisierung

Regelmäßig würde ich meine Tabellen erstellen und dann Linq zu SQL verwenden, um alle meine Klassen zu generieren. Aber jetzt, da ich einige meiner Klasseneigenschaften serialisiere, wenn ich die Datenbanktabellen erstelle, definiere ich diese Eigenschaften als varchar (für die XML-Zeichenkette) anstelle des tatsächlichen Typs, der sie sind. Daher werden die automatisch generierten Klassen mit string typed-Eigenschaften anstelle der tatsächlichen Klassen erstellt.

Gibt es eine Möglichkeit, Linq zu sagen, meine de/serialization automatisch anzuwenden, wenn Objekte aus der Datenbank eingefügt/abgerufen werden? Und behalte den ursprünglichen Typ für meine serialisierten Eigenschaften in den von Linq automatisch generierten Klassen?

A-Klasse zum Beispiel

Beachten Sie, dass classBProp vom Typ ClassB ist.

class ClassA 
{ 
    private string name; 
    public string Name 
    { 
     get { return name; } 
     set { name = value; } 
    } 

    private ClassB classBProp; // <-- This is something i'm serializing 
    public ClassB ClassBProp 
    { 
     get { return classBProp; } 
     set { classBProp = value; } 
    } 

    public ClassA() 
    { 
     classBProp = new ClassB(); 
    } 
} 

Die Tabelle für die Klasse

Hier ClassBProp ist vom Typ varchar. Also generiert Linq to SQL die Klasse mit einer String-Eigenschaft.

CREATE TABLE [dbo].[ClassA] (
[Id]   INT   NOT NULL, 
[Name]  VARCHAR (50) NULL, 
[ClassBProp] VARCHAR (MAX) NULL, 
PRIMARY KEY CLUSTERED ([Id] ASC) 
); 

Antwort

1

Ich glaube nicht, dass das möglich ist.

Für Situationen wie diese müssten Sie ein anderes Objekt verwenden, das die Tatsache ausblendet, dass Sie das Objekt als Xml-Zeichenfolge speichern. So

:

  1. KlasseA wird eine Eigenschaft vom Typ ClassB haben.
  2. ClassC wird die tatsächliche Linq-Klasse sein. Es sieht genau wie ClassA aus, außer dass es keine Eigenschaft vom Typ ClassB, sondern ein Feld vom Typ String hat.
  3. Ordnen Sie ClassA beim Speichern ClassC zu. Hier serialisieren Sie ClassB als Xml.
  4. Beim Lesen ClassC ClassA zuordnen. Hier deserialisieren Sie XML als ClassB.

Ich hoffe, dass hilft.

+0

Ok danke! Ich dachte, es gäbe einen angemesseneren Weg, dies zu tun. Aber wenn es so gemacht wird, geht es mir gut. Nur um zu klären – moonlander

+0

Entschuldigung, versehentlich gepostet. Nur um zu verdeutlichen, beim Speichern ich nur eine ClassC-Instanz erstellen und dann DataContext.ClassAs.InsertOnSubmit (classCInstance). – moonlander

+0

Und zum Lesen muss ich eine ganz neue Sammlung von deserialisierten Objekten erstellen, um die serialisierten Objekte zu spiegeln. Oder wenden Sie eine Deserialize-Methode für jedes Objekt an, wenn ich darauf zugreifen möchte. Ich habe es richtig? – moonlander