Как сопоставить компонент с LINQ для SQL? - PullRequest
1 голос
/ 14 января 2011

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

1 Ответ

0 голосов
/ 02 марта 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...