Как сгладить сопоставления таблиц Linq-To-Sql?

У меня есть сопоставление Linq-To-Sql между классами POCO и моей БД. Я хочу иметь возможность добавлять в свои классы свойства, представляющие несколько более сложные конструкции, чем простые скалярные значения.

Например, у меня есть пользовательский тип структуры, который содержит два простых скалярных значения. Я не хочу делать эту другую таблицу, а затем добавлять FK в качестве свойства. Можно ли сопоставить свойства этой структуры с помощью XML-файла сопоставления Linq-to-Sql?

Например,

public class Foo
{
    public string Blah { get; set; }
    public Bar Yada { get; set; }
}

public struct Bar
{
    public int A { get; set; }
    public int B { get; set; }
}

Как указать, что Blah, Yada.A и Yada.B все сохраняются как столбцы в таблице Foo?

Возможно ли это вообще сделать?


person mckamey    schedule 19.12.2009    source источник


Ответы (2)


Я думаю, что для этого требуется Entity Framework в .NET4. См. эта запись в блоге о сложных типах и сущностях.

person Sander Rijken    schedule 19.12.2009
comment
Спасибо за совет. Я действительно надеюсь придерживаться LINQ-to-SQL для этого небольшого приложения. Если бы я перешел на EF, мне действительно пришлось бы отступить и посмотреть на NHibernate и другие. - person mckamey; 20.12.2009

Это действительно неубедительно, но похоже, что это может быть то, что мне нужно делать, если я буду придерживаться L2S.

public class Foo
{
    public string Blah { get; set; }

    public int Bar_A { get; set; }
    public int Bar_B { get; set; }

    /* not mapped to DB */
    public Bar Yada
    {
        get { return new Bar { A = this.Bar_A, B = this.Bar_B }; }
        set { this.Bar_A = value.A; this.Bar_B = value.B; }
    }
}

public struct Bar
{
    public int A { get; set; }
    public int B { get; set; }
}

Конечно, в реальном коде я бы, вероятно, сделал так, чтобы он не создавал значение снова и снова, потому что мой реальный тип Bar содержит больше, чем просто содержит значения.

person mckamey    schedule 20.12.2009