我有很多具有相同模式但名称不同的表。我可以创建一个代表性的DBML / DataContext并将其重用于所有表,还是必须将每个表拖到dbml设计器中?
答案 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也出来了。