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