C# 更改EF4中的db表名(实体框架4)

C# 更改EF4中的db表名(实体框架4),c#,.net,entity-framework,entity-framework-4,C#,.net,Entity Framework,Entity Framework 4,有人知道如何更改EF4(实体框架4)中实体的映射db表吗 稍后编辑:我想我已经在模型浏览器中找到了定义表名的位置。但是它们的名称是只读的,因此无法使用设计器编辑它们。此外,在xml模式中没有对表名的引用(根据我搜索的内容)。您可以执行一个存储过程来更改表名,并将表名作为变量传递。然后将存储的进程导入EF4 CREATE PROCEDURE ChangeTableName @TableName varchar(200) AS BEGIN SET NOCOUNT ON; EX

有人知道如何更改EF4(实体框架4)中实体的映射db表吗


稍后编辑:我想我已经在模型浏览器中找到了定义表名的位置。但是它们的名称是只读的,因此无法使用设计器编辑它们。此外,在xml模式中没有对表名的引用(根据我搜索的内容)。

您可以执行一个存储过程来更改表名,并将表名作为变量传递。然后将存储的进程导入EF4

CREATE PROCEDURE ChangeTableName
    @TableName varchar(200)
AS
BEGIN
    SET NOCOUNT ON;
    EXEC sp_rename "User", @TableName
END
GO

如果只需要更改表的名称,可以:

  • 使用XML编辑器打开EDMX文件
  • 在其中找到SSDL节
  • 定位实体集元素,例如
  • 添加
    Table=“MyTableName”
    属性<代码>
  • 这是一份完整的报告


    希望这会有所帮助。

    我相信您所要求的是重新配置实体到表的映射。可以在实体上单击鼠标右键,然后选择“表映射”。这将向您显示映射表的实体。你可以在那里换桌子。但是,当您打开下拉列表时,您将只看到使用更新模型向导导入的表。如果未导入该表,则不会列出该表。然后可以将属性适当地映射到表的列名。

    另一种解决方案是重写
    DbContext
    类中的方法

    public class MyDbContext : DbContext
    {
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Product>().ToTable("DB_PRODUCTS_TBL");
            // otherwise EF assumes the table is called "Products"
        }
    }
    
    公共类MyDbContext:DbContext
    {
    模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
    {
    modelBuilder.Entity().ToTable(“DB_PRODUCTS_TBL”);
    //否则,EF假定该表称为“产品”
    }
    }
    
    在模型浏览器或设计图面中,在图元上单击鼠标右键,然后选择“特性”。在“属性”窗口中,编辑“实体集名称”字段


    这对我来说很有效,但是我先设计模式,然后生成数据库。

    因为我先创建了数据库,所以我做了以下工作:

  • 备份了*.edmx文件
  • 更改了我的数据库表名
  • 按照您的建议,在属性中重命名实体集名称
  • 然后,通过右键单击实体,根据数据库更新模型
  • 我注意到*.edmx文件缺少一半行,所以我用备份覆盖了*.edmx文件,在记事本中打开它,并用新表名替换了所有旧表名
  • 重新构建了MVC应用程序,并进行了测试,效果良好
  • 注意:是否需要上述所有步骤我不知道,只是 我所做的一切都对我有效


    但我看不出导入存储过程将如何更新模式。我想我没有弄清楚我想要实现什么,我试图更改ef模式映射到的表,例如,现在它从数据库中的表x检索数据,我希望它现在从表y检索数据,两个表都存在于数据库中,都具有完全相同的结构。我不能简单地将数据从一个表导入另一个表的原因是,一个表被一些无法修改的应用程序使用,并且所有应用程序都需要访问相同的数据。谢谢你的回复,我知道问题出在哪里了。需要在重命名表后动态更新EF模式。这可能适用于小型本地项目,但在企业环境中,这是完全不可接受的。谁知道是什么影响了这些表名。这种方法的问题是每次重新生成db映射时都必须更改它。这不是Zacho提到的实用方法。