2011-01-14 49 views
1

我有两个类。我想将Class1映射到linq to sql的数据库表。如何用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的Name属性。在NHibernate f.ex.中,我会在xml映射中使用'component'-element,但是如何处理linq到sql?

回答

0

据我所知,LINQ to SQL不允许这样做。但几乎总是有几个解决方法。

第一个是创建一个列的每复杂类型属性。有关更多详细信息,请参阅Complex Types in LINQ-to-SQL—Reloaded文章。

第二个是将类Class2与表关联,并在Class1(主/外键)中添加对它的引用。

,最后一个是存储型Class2系列化Class2财产。在SomeTable中,如果您更喜欢JavaScriptSerializer或其他类型,则它可以是nvarchar(MAX)类型的列如果您更喜欢序列化为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); 
    } 
} 

数据通过LINQ加载到SQL后OnLoaded被调用,OnValidate之前被调用代码被保存 - 这是序列化/反序列化的最佳位置(注意,序列化只发生在保存和实体负载上的反序列化)。