使实体框架意识到表/列重命名

时间:2018-04-25 08:16:02

标签: c# sql-server winforms entity-framework edmx

重命名表或列时,如何确保edmx的“从数据库更新模型”可以识别新的表结构?

MyTable 只有2列。

ID
name

重构 - >重命名(Ctrl R + R)

myTableID
fullName

以下哪项是“正确”对应的edmx更改,因此应用程序无需运行时/编译错误

  1. 重构 - >在Edmx文件或
  2. 上重命名
  3. 右键单击 - >从数据库更新模型,删除旧项目或
  4. 手动创建,删除和验证edmx
  5. 正如您所看到的,它是一个非常简单的重命名。

    编译错误

    运行时错误:         EFControl _当前错误CS0103:当前上下文中不存在名称“_current”

1 个答案:

答案 0 :(得分:1)

更新:重命名栏目 我看到你的问题已经改变,因为你要求重命名列,所以我更新了我的答案。 让我们按照您的新示例,通过T-SQL创建表:

CREATE TABLE [dbo].MyTable
(
    [Id] INT NOT NULL PRIMARY KEY, 
    [name] NCHAR(10) NULL
)

实体框架(EF)将为您创建MyTable.cs文件:

public partial class MyTable
{
    public int Id { get; set; }
    public string name { get; set; }
}

这是您的EDMX的主要部分:

<edmx:ConceptualModels>
  <Schema Namespace="database1Model" Alias="Self" annotation:UseStrongSpatialTypes="false" xmlns:annotation="http://schemas.microsoft.com/ado/2009/02/edm/annotation" xmlns:customannotation="http://schemas.microsoft.com/ado/2013/11/edm/customannotation" xmlns="http://schemas.microsoft.com/ado/2009/11/edm">
    <EntityContainer Name="database1Entities" annotation:LazyLoadingEnabled="true" >
      <EntitySet Name="MyTables" EntityType="database1Model.MyTable" />
    </EntityContainer>
    <EntityType Name="MyTable">
      <Key>
        <PropertyRef Name="Id" />
      </Key>
      <Property Name="Id" Type="Int32" Nullable="false" />
      <Property Name="name" Type="String" MaxLength="10" FixedLength="true" Unicode="true" />
    </EntityType>
  </Schema>
</edmx:ConceptualModels>

然后使用例如重命名列。 Visual Studio Server Explorer,它将生成此T-SQL(我没有在MyTable中插入任何数据):

CREATE TABLE [dbo].[MyTable] (
    [myTableID]   INT        NOT NULL,
    [fullName] NCHAR (10) NULL,
    PRIMARY KEY CLUSTERED ([myTableID] ASC)
);

此时,如果您从数据库更新EDMX,您将得到:

enter image description here

因此,如果您打开EDMX文件并删除后面跟<!-- REMOVE --->的三个元素,如下所示:

<edmx:ConceptualModels>
  <Schema Namespace="database1Model" Alias="Self" annotation:UseStrongSpatialTypes="false" xmlns:annotation="http://schemas.microsoft.com/ado/2009/02/edm/annotation" xmlns:customannotation="http://schemas.microsoft.com/ado/2013/11/edm/customannotation" xmlns="http://schemas.microsoft.com/ado/2009/11/edm">
    <EntityContainer Name="database1Entities" annotation:LazyLoadingEnabled="true" >
      <EntitySet Name="MyTables" EntityType="database1Model.MyTable" />
    </EntityContainer>
    <EntityType Name="MyTable">
      <Key>
        <PropertyRef Name="Id" /><!-- REMOVE -->
        <PropertyRef Name="myTableID" />
      </Key>
      <Property Name="Id" Type="Int32" Nullable="false" /><!-- REMOVE -->
      <Property Name="name" Type="String" MaxLength="10" FixedLength="true" Unicode="true" /><!-- REMOVE -->
      <Property Name="myTableID" Type="Int32" Nullable="false" />
      <Property Name="fullName" Type="String" MaxLength="10" FixedLength="true" Unicode="true" />
    </EntityType>
  </Schema>
</edmx:ConceptualModels>

从您的模型更新,您很高兴。甚至您的自动生成的文件MyTable.cs也将使用新名称进行更新:

public partial class MyTable
{
    public int myTableID { get; set; }
    public string fullName { get; set; }
}

对原始问题的回答:重新制作表格 一种方法是编辑.EDMX文件,Entity Framework为您创建该文件,并存储有关将数据库映射到对象的所有信息。 此文件可以在项目的根文件夹中找到,即.csproj文件所在的位置,并且只是可以使用文本编辑器打开的XML

  1. 在VisualStudio之外,例如PsPad,NotePad ++等。
  2. 或者在Visual Studio中右键单击它,选择&#34;打开...&#34;并选择&#34; XML(文本)编辑器&#34;。
  3. 我猜你的Foo班级对应Foo表格;后者现在可能是FooNew或类似的东西。

    要重命名表但保留Foo类,只需查看EDMX文件的这一部分:

    <!-- SSDL content -->
    <edmx:StorageModels>
    ...
        <EntitySet Name="Foo" ... Schema="dbo" ... />
    ...
    </edmx:StorageModels>
    

    EntitySet添加Table="FooNew"作为属性内,根据此question的答案提供建议:

    <EntitySet Name="Foo" ... Schema="dbo" ... Table="FooNew" />
    

    此时,关闭并保存;重新打开edmx,双击它,然后&#34;从数据库更新模型&#34;就像你以前一样。