Насколько я знаю, LINQ to SQL не позволяет этого.Но, как почти всегда, для этого есть несколько обходных путей.
Первый - создать свойство столбца на комплексный тип .См. Сложные типы в LINQ-to-SQL - перезагружена статья для получения более подробной информации.
Второй - связать класс Class2
с таблицей и добавить ссылку на него в Class1
(первичный / внешний ключ).
И последний - хранить Class2
свойство типа 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
вызывается перед сохранением кода - это лучшее место для сериализации / десериализации (обратите внимание, что сериализация происходит только при сохранении и десериализации при загрузке объекта).