2011-01-14 48 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之前被調用代碼被保存 - 這是序列化/反序列化的最佳位置(注意,序列化只發生在保存和實體負載上的反序列化)。