每个表中的列名必须是唯一的。表“dbo.Foos”中的列名“StripeRecipientId”被指定多次

Posted

技术标签:

【中文标题】每个表中的列名必须是唯一的。表“dbo.Foos”中的列名“StripeRecipientId”被指定多次【英文标题】:Column names in each table must be unique. Column name 'StripeRecipientId' in table 'dbo.Foos' is specified more than once 【发布时间】:2015-12-27 00:20:21 【问题描述】:

我有一个名为 Foo 的模型类,其中包括这些属性。

public string StripeRecipientId  get; set; 

public override bool HasProvidedBillingInformation

    get
    
        // return !string.IsNullOrEmpty(this.StripeRecipientId);

        return false;
    

我已启用迁移并正在使用 Code First。当我运行update-database commandlet 时,无论是否指定了-Force 选项,我都会收到此错误:

Column names in each table must be unique. Column name 'StripeRecipientId' in table 'dbo.Foos' is specified more than once.

我反复检查和三次检查,在我的模型和表格中只有一列该名称。此列是由之前运行的 update-database 命令行开关创建的。

我很想删除我的数据库,然后应用迁移,但这意味着我必须创建大量测试数据才能测试我刚刚开发的功能。

我正在使用实体框架 v6.1.2。

如何摆脱这个错误?

【问题讨论】:

也许 EF 认为没有应用之前的迁移并正在尝试重新应用它?尝试“update-database -verbose”查看它正在尝试应用哪些迁移 我忘了说,我总是做-Verbose。它正在尝试再次重新创建该列,我不知道为什么。 好习惯 :) 是尝试应用旧迁移,还是您的最新迁移尝试创建列? 我从来没有在代码优先迁移方面遇到过太多运气。数据库初始化程序似乎定期执行此操作(在运行应用程序时导致错误)。我真的很想先做代码,特别是从源代码控制的角度来看..但我没有太多运气。并且在多个上下文中,这些命令是荒谬的。相比之下,Data First 似乎要容易得多。 【参考方案1】:

运行带有-IgnoreChanges 标志的Add-Migration 命令。然后再次运行Update-Database

-更新-

这些命令应该在包管理器控制台中运行。从主菜单:工具-> NuGet 包管理器-> 包管理器控制台。

【讨论】:

谢谢。你是对的,虽然我有一段时间有这个问题并且它消失了,我不记得了。尽管我已经使用迁移有一段时间了,但我最近才抽出时间正确研究迁移。 @longestwayround 谢谢。我实际上尝试在包管理器中运行它们,但它无法识别命令并返回此错误消息:Add-Migrations : The term 'Add-Migrations' is not Recognized as the name of a cmdlet, function,脚本文件或可运行的程序。检查名称的拼写,或者如果包含路径,请验证路径是否正确,然后重试。 在尝试在包管理器控制台上运行这些命令之前,我还有什么要做的吗? @UlyssesAlves 您是否已安装 Entity Framework 并已运行 Enable-Migrations 命令?请记住,由于与 Entity Framework 迁移表不同步的原因完全无关,SQL 仍可能引发此错误。 @UlyssesAlves 这是添加迁移而不是添加迁移s 尝试此操作时出现错误:“找不到与参数名称 'ignorechanges' 匹配的参数”【参考方案2】:

Add-Migration -IgnoreChanges 因为它对我有用,但仍然抛出更多错误。

【讨论】:

【参考方案3】:

如果您还在数据库表中添加了这些属性,您将继续收到这些错误。所以我不得不从我自己的表中删除属性以实现重新脚手架并随后更新数据库。所以在你必须删除属性之后运行Add-Migration,你会得到满意的结果,然后运行Update-Database,它也应该是令人满意的。

【讨论】:

【参考方案4】:

这对我有用。

    我运行了这个Add-Migration -IgnoreChanges,我得到了错误 您之前的两次迁移正在等待中。示例: Migration-1 , 迁移-2

    我运行update-database -target Migration-1

    update-database -target Migration-2

    数据库已成功创建。 Running Seed method.

【讨论】:

【参考方案5】:

这对我来说有两个步骤:

Step 1) Just delete this column from a table in Database
Step 2) Rebuild the Project and run Project.

【讨论】:

【参考方案6】:

简单删除迁移文件夹中的文件并运行以下命令:

add-migration seednew1

然后:

update-database -verbose

【讨论】:

【参考方案7】:

对我来说,在添加/删除操作期间我必须搞砸的数据库快照与实际保存在数据库中的不同,所以我最终放弃了快照更改并重新应用迁移。

【讨论】:

【参考方案8】:

更新数据库进程正在引用较旧的迁移 [可能包含一些添加列脚本] ... 使用这些添加删除较旧的迁移... 记得保留 SNAPSHOT [已保存脚本的摘要] ... 并再次运行您的迁移......它应该可以工作! 一切顺利:))

【讨论】:

【参考方案9】:

关于人们让 -IgnoreChanges 起作用的问题

因此,就我而言,我发现问题在于 -IgnoreChanges 选项特定于实体框架,而我使用的是 EFCore。我发现一个解决方案是查看数据库项目的迁移文件夹中的各个提交。通过遵循 this link 的建议并注释掉特定的 Up 函数体,我能够运行 Update-Database。更新数据库工作正常。

【讨论】:

【参考方案10】:

我有以下情况: 我首先使用查询向数据库添加了一个列,然后我尝试在包管理器控制台中执行“更新数据库”。他给了我一个错误。我从表中删除了错误的列,并在包管理器控制台 vs2019 中再次执行了“更新数据库”,它工作了

【讨论】:

以上是关于每个表中的列名必须是唯一的。表“dbo.Foos”中的列名“StripeRecipientId”被指定多次的主要内容,如果未能解决你的问题,请参考以下文章

创建触发器的问题。每个表中的列名必须是唯一的。微软SQL

每个视图或函数中的列名必须是唯一的

如何解决sqlserver2005中用多表连接的结果建一张新表时,提示各表中的列名必须唯一的问题?

完整性约束语法定义

完整性约束语法定义

内联函数,每个视图或函数中的列名必须唯一