Могу ли я использовать один и тот же DBML для доступа к разным таблицам? - PullRequest
0 голосов
/ 16 апреля 2010

У меня много таблиц с одинаковыми схемами, но разными именами. Могу ли я создать один репрезентативный DBML / DataContext и повторно использовать его для всех таблиц, или мне нужно перетащить каждую таблицу в конструктор dbml?

Ответы [ 2 ]

0 голосов
/ 18 апреля 2010

Это - это , это можно сделать без перетаскивания каждой таблицы из конструктора, НО это PITA, потому что вы должны вручную определить все отображения таблиц для каждого последующего объекта (который является то, что дизайнер DBML делает для вас, по сути). Вот пример:

Определите пару таблиц:

create table Person (
    Id int identity not null,
    Name varchar(50),
    Email varchar(50),
    constraint PK_Person primary key (Id)
)

create table OtherPerson (
    Id int identity not null,
    Name varchar(50),
    Email varchar(50),
    constraint PK_OtherPerson primary key (Id)
)

Добавьте к ним некоторые данные:

Person
Id  Name    Email
1   Fred    fred@yabbadabba.com
2   Wilma   wilma@yabbadabba.com

OtherPerson
Id  Name    Email
1   Barney  barney@rubble.com
2   Betty   betty@rubble.com

Создайте файл DBML с именем TestsDb и перетащите таблицу Person на поверхность. Теперь создайте следующий частичный класс:

partial class TestsDbDataContext
{
    public System.Data.Linq.Table<OtherPerson> OtherPersons
    {
        get { return this.GetTable<OtherPerson>(); }
    }
}

Для удобства я использовал ReSharper для извлечения интерфейса из Person, например так:

public interface IPerson
{
    int Id { get; set; }
    string Name { get; set; }
    string Email { get; set; }
}

А затем я создал новый класс с именем OtherPerson, который реализует этот интерфейс:

[Table(Name = "dbo.OtherPerson")]
public class OtherPerson : IPerson
{
    [Column(AutoSync = AutoSync.OnInsert, DbType = "Int NOT NULL IDENTITY",
            IsPrimaryKey = true, IsDbGenerated = true)]
    public int Id { get; set; }

    [Column(DbType = "VarChar(50)")]
    public string Name { get; set; }

    [Column(DbType = "VarChar(50)")]
    public string Email { get; set; }
}

И проверить все это в основной функции следующим образом:

class Program
{
    static void Main()
    {
        var dc = new TestsDbDataContext();

        var persons = dc.Persons.ToList().OfType<IPerson>();
        writePeople(persons);

        var otherPersons = dc.OtherPersons.ToList().OfType<IPerson>();
        writePeople(otherPersons);
    }

    private static void writePeople(IEnumerable<IPerson> people)
    {
        foreach (var person in people)
        {
            Console.WriteLine("{0}: {1} ({2})", person.GetType().Name,
                              person.Name, person.Id);
        }
    }
}

И это конечный результат:

Person: Fred (1)
Person: Wilma (2)
OtherPerson: Barney (1)
OtherPerson: Betty (2)

Как видите, это возможно, но стоит ли это того? Полагаю, это того стоило бы, если бы у вас была какая-то автоматическая генерация кода (в отличие от ручной генерации кода, запускаемой путем редактирования файла DBML), но в противном случае, вероятно, нет.

Вы можете использовать Entity Framework, хотя. Я не слишком знаком с этим, но я думаю он должен справиться с подобными вещами довольно хорошо, и EF4 теперь тоже отсутствует.

0 голосов
/ 16 апреля 2010

Я не думаю, что это возможно в смысле «истинных» таблиц.

Это может быть достигнуто с помощью процедур.

Но обычно каждая таблица должна представлять информацию разного типа, поэтому для представления этого отображения необходим другой класс.

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