2011-01-14 2 views
1

У меня есть два класса. Я хочу сопоставить Class1 с таблицей базы данных с linq для 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. В NHibernate f.ex. я бы использовал «компонентный» элемент в xml-mapping, но как сделать с linq в sql?

ответ

0

Насколько я знаю, LINQ to SQL этого не допускает. Но почти всегда есть несколько обходных решений.

Первый из них - это создание свойства типа типа столбцов на комплексный комплекс. См. Статью Complex Types in LINQ-to-SQL—Reloaded для более подробной информации.

Второй способ - связать класс Class2 с таблицей и добавить ссылку на нее в Class1 (первичный/внешний ключ).

И последнее должно хранить Class2 property of type Class2 сериализованный. В SomeTable это может быть столбец типа nvarchar(MAX), если вы предпочитаете JavaScriptSerializer или, например, 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 вызываются перед код сохраняется - это лучшее место для сериализации/десериализации (обратите внимание, что сериализация происходит только при сохранении и десериализации загрузки объекта).

Смежные вопросы