我可以使用相同的DBML访问不同的表吗?

时间:2010-04-16 17:46:05

标签: linq-to-sql

我有很多具有相同模式但名称不同的表。我可以创建一个代表性的DBML / DataContext并将其重用于所有表,还是必须将每个表拖到dbml设计器中?

2 个答案:

答案 0 :(得分:0)

我不认为这在“真实”表格中是可能的。

可以通过程序完成。

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

答案 1 :(得分:0)

可以在不拖动设计器中的每个表的情况下执行此操作, BUT 它是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>(); }
    }
}

为方便起见,我使用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文件触发的手动代码生成相反)可能是值得的,但是否则可能不会。

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