从实体框架中删除重复的 Context.vb 文件

Posted

技术标签:

【中文标题】从实体框架中删除重复的 Context.vb 文件【英文标题】:Remove a duplicate Context.vb files from Entity Framework 【发布时间】:2014-12-03 07:46:24 【问题描述】:

我在 VS2013 中遇到了 EF6 的一些问题。我必须在 Web 应用程序项目中修改数据库优先模型的连接字符串,所以我按照How should I edit an Entity Framework connection string? 的最佳答案中的建议将其从我的 Web.Config 文件中删除。 起初它似乎工作正常,我删除了连接字符串,然后从实体设计器中运行“从数据库更新模型”,重新创建连接字符串,但随后我的构建失败,出现多个错误,类似于:

Public Sub New() has multiple definitions with identical signatures

经过一番挖掘,我发现当我重新创建连接字符串时,EF 创建了第二个名为 Model.Context1.vb 的 Model.Context.vb 文件,并且它们仍然在某处被引用。从那时起,我用记事本打开了包含我的 EF 模型的文件夹中的每个文件,搜索对 Context.vb 或 Context1.vb 的引用,结果为空,如果我删除任何一个文件,我的构建失败,说明找不到文件,因此作为一种解决方法,我打开了 Context.vb 文件并删除了所有代码,因此没有重复,我想通过删除对文件的引用来正确修复它,如果有人知道我该怎么做.

【问题讨论】:

【参考方案1】:

在尝试从源代码管理恢复旧版本的 EF 文件但仍然遇到相同问题后,我将其整理出来,我意识到引用可能在项目文件中。

在 [projectName].vbproj 中我找到了这两个条目:

    <Compile Include="Data\schedulerModel.Context1.vb">
          <AutoGen>True</AutoGen>
          <DesignTime>True</DesignTime>
          <DependentUpon>schedulerModel.Context.tt</DependentUpon>
        </Compile>
    <Content Include="Data\schedulerModel.Context.tt">
          <Generator>TextTemplatingFileGenerator</Generator>
          <DependentUpon>schedulerModel.edmx</DependentUpon>
          <LastGenOutput>schedulerModel.Context1.vb</LastGenOutput>
        </Content>

我删除了第一个,并在第二个中从 context.vb 文件中删除了 1,打开项目并运行重建没有问题。

【讨论】:

【参考方案2】:

我遇到了同样的问题,但分辨率略有不同。无论出于何种原因,更新 edmx 文件似乎会从项目文件中删除一个看似重要的行,这行读取为&lt;LastGenOutput&gt;MyEntityModel.Context.cs&lt;/LastGenOutput&gt;

我将该行重新添加到我的项目文件中,并且更新模型并没有导致任何更多重复的上下文文件。修复后整个块如下所示:

<Content Include="MyEntityModel.Context.tt">
    <Generator>TextTemplatingFileGenerator</Generator>
    <DependentUpon>MyEntityModel.edmx</DependentUpon
    <LastGenOutput>MyEntityModel.Context.cs</LastGenOutput>
</Content>

【讨论】:

【参考方案3】:

我只是想把我的发现添加到这里,因为它已经让我分心了几个星期 - 每次我从数据库更新我的模型时,我都会得到“重复”的上下文、设计器文件等,然后是数百个错误。但是,新的 sp 或 table 或我添加的任何内容只存在于新的“context1”文件中,而不是原始文件中,所以当我将它卷回来时,我不得不再次经历相同的过程等等。

当我想到...源代码控制时,终于亮了起来!我使用 TFS,我发现除非在更新之前检查所有与模型相关的文件,即 Context、Designer 和 Service 文件,否则 EF 会生成几乎所有内容的新版本,大概是因为它无法修改其中一个由于源代码控制而只读的文件。

然后关键是在检查所有内容之前修复项目文件,如上述答案中所述,然后进行更新。如果您在 proj 文件中没有正确获取该标签,即使所有内容都已签出,它也会再次出错。

希望这会有所帮助 - 我的理智正在慢慢恢复。

阿德

【讨论】:

以上是关于从实体框架中删除重复的 Context.vb 文件的主要内容,如果未能解决你的问题,请参考以下文章

在实体框架中重复创建和删除数据库

从 Python 中的字符串中删除转义实体 [重复]

实体框架理解[重复]

如何使用实体框架代码优先从数据库中删除所有相关实体

从实体框架中删除一条记录?

使用实体框架从 ID 列表中删除多个项目