EF Code首先,如何使用不同的模式注册相同的表名?

sam*_*360 12 sql-server entity-framework

我们正在使用Entity Framework,Code First,在我们的数据库中,我们有几个具有相同名称但在不同Schema中的表.

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

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

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

感谢您的帮助!

Lad*_*nka 17

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

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

  • 这只是EF中的一个缺陷,无论其原因如何,都应该映射POCO的完整命名空间,而不仅仅是类名.我的应用程序中有一个模块化结构,我有两个"Field"类,它们在每个模块中是相关的,都映射到扩展的表名. (5认同)
  • 如果我使用不同的类名并在同一个上下文中包含两个类,那么EF会给我一个错误,即两个实体不能共享同一个表(即使我通过Table属性或使用它传递"Schema"名称流畅的API) (3认同)