Насколько я знаю, 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
вызываются перед код сохраняется - это лучшее место для сериализации/десериализации (обратите внимание, что сериализация происходит только при сохранении и десериализации загрузки объекта).