Linq to sql 如何使用linq将组件映射到sql?

Linq to sql 如何使用linq将组件映射到sql?,linq-to-sql,components,mapping,Linq To Sql,Components,Mapping,我有两节课。我想将Class1映射到一个使用linq到sql的数据库表 [Table(Name = "SomeTable")] public class Class1 { public Class2 Class2 { get; set; } } class Class2 { public string Name1 { get; set; } public stri

我有两节课。我想将Class1映射到一个使用linq到sql的数据库表

[Table(Name = "SomeTable")]
public class Class1
{
    public Class2 Class2
    {
        get; 
        set;
    }
}    

class Class2
{
    public string Name1
    {
        get;
        set;
    }

    public string Name2
    {
        get;
        set;
    }

    public string Name3
    {
        get;
        set;
    }
}

数据库表有3列,对应于Class2的名称属性。在NHibernate f.ex中,我会在xml映射中使用“component”元素,但如何处理linq到sql?

据我所知,linq到sql不允许这样做。但几乎总是有一些解决办法

第一个是为每个复杂类型属性创建一列。有关更多详细信息,请参阅文章

第二种方法是将类2与表关联,并在类1主键/外键中添加对它的引用

最后一个是存储Class2序列化类型的Class2属性。在SomeTable中,如果您更喜欢nvarcharMAX类型的列,或者如果您更喜欢序列化而不是xml,则可以是xml类型的列

您的复杂类型非常简单,因此我展示了一个如何使用JavaScriptSerializer实现它的示例。我们应该添加一个Class2类型的伪属性和一个string类型的私有属性,它们将实际存储序列化的值:

public partial class Class1
{
    // this is autogenerated property
    private string Class2Internal {...}

    // this is a fake property
    public Class2 Class2 {get; set;}

    partial void OnLoaded()
    {
        var serializer = new JavaScriptSerializer();
        this.Class2 = serializer.Deserialize<Class2>(this.Class2Internal);
    }

    partial void OnValidate(ChangeAction action)
    {
        var serializer = new JavaScriptSerializer();
        this.Class2Internal = serializer.Serialize(this.Class2);
    }
}
OnLoaded在LINQ将数据加载到SQL之后调用,OnValidate在保存代码之前调用-这是序列化/反序列化的最佳位置注意,序列化只在保存时发生,反序列化在实体加载时发生