C# - 使用 Linq 到 SQL 和 XML 序列化

C# - Using Linq to SQL with XML Serialization

在使用 Linq 对我的对象属性的 某些 进行 SQL 和 XML 序列化时,有些事情我不太明白。

我会定期创建我的 tables,然后使用 Linq to SQL 生成我所有的 classes。但是现在因为我序列化了我的一些 classes 属性,在创建数据库 tables 时,我将这些属性定义为 varchar(对于 XML 字符串)而不是它们的实际类型是。因此,自动生成的 classes 是使用字符串类型的属性创建的,而不是实际的 classes。

有没有办法告诉 Linq 在 inserting/fetching 对象来自数据库时自动应用我的 de/serialization?并在 Linq 自动生成的 classes?

中保留我的序列化属性的原始类型 例如

一个Class

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

本table为class

此处ClassBProp 是varchar 类型。所以 Linq to SQL 使用字符串 属性.

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

我认为这是不可能的。

对于这种情况,您将不得不使用另一个对象来隐藏您将对象存储为 Xml 字符串的事实。

所以:

  1. ClassA 将有一个类型为 ClassB 的 属性。
  2. ClassC 将是实际的 linq class。它看起来就像 ClassA,除了它没有 ClassB 类型的 属性 而是一个字符串类型的字段。
  3. 保存时,将ClassA映射到ClassC。这是将 ClassB 序列化为 Xml.
  4. 的地方
  5. 读的时候把ClassC映射到ClassA。这是将 xml 反序列化为 ClassB 的地方。

希望对您有所帮助。