Sql server EF代码首先,如何用不同的模式注册相同的表名?

Sql server EF代码首先,如何用不同的模式注册相同的表名?,sql-server,entity-framework,Sql Server,Entity Framework,我们使用的是实体框架,首先是代码,在我们的数据库中,有几个表具有相同的名称,但模式不同 我还将模型放在两个不同的名称空间中 如何在DbContext类中注册这些表 protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity<Data.Schema1.Contact>().ToTable("Contact", "schema1"); modelBui

我们使用的是实体框架,首先是代码,在我们的数据库中,有几个表具有相同的名称,但模式不同

我还将模型放在两个不同的名称空间中

如何在DbContext类中注册这些表

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Data.Schema1.Contact>().ToTable("Contact", "schema1");
    modelBuilder.Entity<Data.Schema2.Contact>().ToTable("Contact", "schema2");
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity().ToTable(“Contact”、“schema1”);
modelBuilder.Entity().ToTable(“Contact”、“schema2”);
}

提前谢谢你的帮助

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


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

问题是,如果我将这些类放在两个不同的上下文类中,我就不能再连接这两个表了。。。。有没有办法绕过这个问题?上下文。联系人。包括(“联系人2”);其中Contact2来自不同的上下文。不,您不能进行跨上下文查询。因此,您唯一的选择是为您的类使用不同的名称-当您必须在相同的方法中使用这两种类型时,这也会使您的代码更具可读性。如果我使用不同的名称,则会使用不同的类名,并将这两种名称包含在相同的上下文中,EF给了我一个错误:如果我使用了不同的类名,并且在相同的上下文中包含了这两个类名,EF给了我一个错误,即两个实体不能共享同一个表(即使我通过表属性或使用fluent API传递“模式”名称),这只是EF中的一个缺陷,无论其原因为何,应该映射POCO的完整命名空间,而不仅仅是类名。我的应用程序中有一个模块化结构,我有两个“Field”类,每个模块中都有相关的类,它们都映射到扩展表名。