Linq to sql 我可以使用同一个DBML访问不同的表吗?

Linq to sql 我可以使用同一个DBML访问不同的表吗?,linq-to-sql,Linq To Sql,我有许多模式相同但名称不同的表。我可以创建一个具有代表性的DBML/DataContext并对所有表重新使用它吗?还是必须将每个表都拖到DBML设计器中?我认为这在真正的表的意义上是不可能的 这可以通过程序来完成 但通常每个表都必须表示不同类型的信息,因此需要不同的类来表示此映射。不必从设计器中拖动每个表,就可以完成此操作,但这是一个PITA,因为您必须为每个后续对象手动定义所有表映射,这本质上就是DBML设计器为您所做的。下面是一个例子: 定义一对表: create table Person

我有许多模式相同但名称不同的表。我可以创建一个具有代表性的DBML/DataContext并对所有表重新使用它吗?还是必须将每个表都拖到DBML设计器中?

我认为这在真正的表的意义上是不可能的

这可以通过程序来完成

但通常每个表都必须表示不同类型的信息,因此需要不同的类来表示此映射。

不必从设计器中拖动每个表,就可以完成此操作,但这是一个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
创建一个名为TestsDb的DBML文件,并将Person表拖到曲面上。现在创建以下分部类:

partial class TestsDbDataContext
{
    public System.Data.Linq.Table<OtherPerson> OtherPersons
    {
        get { return this.GetTable<OtherPerson>(); }
    }
}
然后我创建了一个名为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);
        }
    }
}
正如你所看到的,这是可能的,但它真的值得吗?我认为,如果您有某种自动代码生成,而不是通过编辑DBML文件触发的手动代码生成,那么这可能是值得的,但除此之外,可能不是

不过,您可以使用实体框架。我对它不太熟悉,但我认为它应该能很好地处理这类事情,EF4现在也推出了

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)