Это - это , это можно сделать без перетаскивания каждой таблицы из конструктора, НО это 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 теперь тоже отсутствует.