2011-12-17 54 views
10

我们使用的是实体框架,Code First,在我们的数据库中,我们有几个具有相同名称但具有不同Schema的表。EF代码首先,如何用不同的模式注册相同的表名?

我也把模型放在两个不同的命名空间中。

我如何在我的DbContext类中注册这些表?

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Data.Schema1.Contact>().ToTable("Contact", "schema1"); 
    modelBuilder.Entity<Data.Schema2.Contact>().ToTable("Contact", "schema2"); 
} 

感谢您的帮助提前!

回答

15

您的类必须具有不同的名称,或者您必须为每个模式使用单独的上下文。

原因是内部使用了EDM模型。即使您先使用代码,它仍然会在后面创建EDM模型,并且必须遵循所有限制以及POCO类与CSDL模型中定义的实体的匹配方式。来自EDM的实体是和POCO类通过类名匹配(没有名称空间)。因为映射到同一个上下文中的每个类名称必须是唯一的,而不同的名称空间不会使它成为不同的类名称。

+0

问题是,如果我把类放在两个不同的上下文类中,我不再可以加入这两个表...... 有什么办法可以解决这个问题吗? Context.Contacts.Include(“Contacts2”); 其中Contact2来自不同的上下文。 – sam360 2011-12-19 16:41:22

+0

不,你不能进行跨上下文查询。因此,唯一的选择是为您的类使用不同的名称 - 当您必须使用相同方法处理这两种类型时,它还会使代码更具可读性。 – 2011-12-19 19:45:10

+1

如果我使用不同的类名并在同一上下文中包含这两个名称,EF会给我一个错误: – sam360 2012-04-17 12:07:37