2016-10-14 8 views
0

Есть что-то, что я не совсем понимаю при использовании Linq для SQL и сериализации XML на свойств моего объекта.C# - Использование Linq to SQL с сериализацией XML

Регулярно я создавал свои таблицы, а затем использовал Linq to SQL для генерации всех моих классов. Но теперь, когда я сериализую некоторые из свойств моих классов, при создании таблиц базы данных, я определяю эти свойства как varchar (для строки XML) вместо фактического типа, которым они являются. Таким образом, автоматически создаваемые классы создаются с строковыми типизированными свойствами вместо реальных классов.

Есть ли способ сказать Linq применить мою де/сериализацию автоматически при вставке/извлечении объектов из базы данных? И сохранить исходный тип для моих сериализованных свойств в классах, созданных автоматически Linq?

Класс, например

Обратите внимание, что classBProp имеет тип ClassB.

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(); 
    } 
} 

Стол для класса

Здесь ClassBProp имеет тип VARCHAR. Поэтому Linq to SQL генерирует класс со свойством string.

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

ответ

1

Я не думаю, что это возможно.

Для ситуаций, подобных этому, вам придется использовать другой объект, который скрывает тот факт, что вы храните объект в виде строки Xml.

Итак:

  1. ClassA будет иметь свойство типа ClassB.
  2. ClassC будет фактическим классом linq. Он выглядит так же, как ClassA, за исключением того, что он не обладает свойством типа ClassB, а скорее полем типа string.
  3. При сохранении сопоставьте ClassA с ClassC. Здесь вы сериализуете ClassB как Xml.
  4. При считывании карты ClassC в ClassA. Здесь вы deserialize xml как ClassB.

Я надеюсь, что это поможет.

+0

Хорошо спасибо! Я думал, что есть более правильный способ сделать это. Но если это так, то я в порядке. Чтобы уточнить – moonlander

+0

Извините, отправил по ошибке. Просто, чтобы уточнить, при сохранении я просто создаю экземпляр ClassC, а затем dataContext.ClassAs.InsertOnSubmit (classCInstance). – moonlander

+0

И для чтения мне нужно будет создать совершенно новую коллекцию десериализованных объектов, чтобы отразить сериализованные. Или примените метод десериализации для каждого объекта, когда я хочу получить к нему доступ. Я понял? – moonlander