让 Entity Framework 意识到 Tables/Column 重命名
Making Entity Framework Aware of Tables/Column Renames
重命名 Table 或列时,如何确保 edmx 的 "Update Model from Database" 识别新的 Table 结构?
MyTable 只有 2 列。
ID
name
重构 --> 重命名 (Ctrl R + R)
myTableID
fullName
以下哪项是 "right" 相应的 edmx 更改,因此应用程序可以正常工作而不会出现 runtime/Compile 错误
- 重构 --> 重命名 Edmx 文件或
- 右键单击 --> 从数据库更新模型,删除旧项目或
- 手动创建、删除和验证 edmx
如您所见,这是一个非常简单的重命名。
编译错误
运行-时间错误:
EFControl _current 错误 CS0103:当前上下文中不存在名称“_current”
更新:重命名列
我看到你的问题已经改变,因为你问的是重命名列,所以我正在更新我的答案。
让我们按照您的新示例并通过 T-SQL 创建您的 table:
CREATE TABLE [dbo].MyTable
(
[Id] INT NOT NULL PRIMARY KEY,
[name] NCHAR(10) NULL
)
Entity Framework (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,您将得到:
因此,如果您打开 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>
并根据您的模型进行更新,一切顺利。甚至您的 auto-generated 文件 MyTable.cs 也将更新为新名称:
public partial class MyTable
{
public int myTableID { get; set; }
public string fullName { get; set; }
}
原始问题的答案:重命名 TABLE
一种方法是编辑您的 .EDMX 文件,该文件 Entity Framework 为您创建并存储有关将数据库映射到您的对象的所有信息。
该文件可以在项目的根文件夹中找到,即 .csproj 文件所在的位置,它只是一个可以用文本编辑器打开的 XML
- 在 VisualStudio 之外,例如PsPad、NotePad++ 等
- 或right-clicking它在Visual Studio里面,选择"Open with..."然后选择"XML (Text) Editor"。
我猜你的Foo
class对应了Foo
table;后者现在可能是 FooNew
或类似的东西。
要重命名 table 但保留 Foo
class,只需查找 EDMX 文件的这一部分:
<!-- SSDL content -->
<edmx:StorageModels>
...
<EntitySet Name="Foo" ... Schema="dbo" ... />
...
</edmx:StorageModels>
在 EntitySet
中添加 Table="FooNew"
作为属性,正如这个 question:
的答案所建议的
<EntitySet Name="Foo" ... Schema="dbo" ... Table="FooNew" />
此时,关闭并保存;重新打开 edmx double-clicking,然后像以前一样 "Update Model From Database"。
重命名 Table 或列时,如何确保 edmx 的 "Update Model from Database" 识别新的 Table 结构?
MyTable 只有 2 列。
ID
name
重构 --> 重命名 (Ctrl R + R)
myTableID
fullName
以下哪项是 "right" 相应的 edmx 更改,因此应用程序可以正常工作而不会出现 runtime/Compile 错误
- 重构 --> 重命名 Edmx 文件或
- 右键单击 --> 从数据库更新模型,删除旧项目或
- 手动创建、删除和验证 edmx
如您所见,这是一个非常简单的重命名。
编译错误
运行-时间错误: EFControl _current 错误 CS0103:当前上下文中不存在名称“_current”
更新:重命名列 我看到你的问题已经改变,因为你问的是重命名列,所以我正在更新我的答案。 让我们按照您的新示例并通过 T-SQL 创建您的 table:
CREATE TABLE [dbo].MyTable
(
[Id] INT NOT NULL PRIMARY KEY,
[name] NCHAR(10) NULL
)
Entity Framework (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,您将得到:
因此,如果您打开 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>
并根据您的模型进行更新,一切顺利。甚至您的 auto-generated 文件 MyTable.cs 也将更新为新名称:
public partial class MyTable
{
public int myTableID { get; set; }
public string fullName { get; set; }
}
原始问题的答案:重命名 TABLE 一种方法是编辑您的 .EDMX 文件,该文件 Entity Framework 为您创建并存储有关将数据库映射到您的对象的所有信息。 该文件可以在项目的根文件夹中找到,即 .csproj 文件所在的位置,它只是一个可以用文本编辑器打开的 XML
- 在 VisualStudio 之外,例如PsPad、NotePad++ 等
- 或right-clicking它在Visual Studio里面,选择"Open with..."然后选择"XML (Text) Editor"。
我猜你的Foo
class对应了Foo
table;后者现在可能是 FooNew
或类似的东西。
要重命名 table 但保留 Foo
class,只需查找 EDMX 文件的这一部分:
<!-- SSDL content -->
<edmx:StorageModels>
...
<EntitySet Name="Foo" ... Schema="dbo" ... />
...
</edmx:StorageModels>
在 EntitySet
中添加 Table="FooNew"
作为属性,正如这个 question:
<EntitySet Name="Foo" ... Schema="dbo" ... Table="FooNew" />
此时,关闭并保存;重新打开 edmx double-clicking,然后像以前一样 "Update Model From Database"。