执行全新安装 Piranha CMS 时出现外键约束错误
Posted
技术标签:
【中文标题】执行全新安装 Piranha CMS 时出现外键约束错误【英文标题】:Foreign Key constraint error when performing fresh install of Piranha CMS 【发布时间】:2014-06-18 02:48:22 【问题描述】:Piranha CMS 是一个面向程序员的 CMS(我更喜欢编写它,因为我上次被否决了!)。我花了整个下午试图解决这个问题:无论我尝试从 Sql Compact Server 数据库迁移到 SQL Server 数据库,还是使用空的 SQL Server 数据库从头开始一切,我都会收到以下错误:
在表 'category' 上引入 FOREIGN KEY 约束 'FK_dbo.category_dbo.sysuser_category_updated_by' 可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。
我能够通过第一步(创建管理员帐户和密码),但是每当我尝试登录时都会引发此异常。
我做错了什么?
感谢您的帮助!
更新
堆栈指示错误的来源:
[HttpException (0x80004005): The pre-application start initialization method
Start on type Piranha.Web.ApplicationModule threw an exception with the following
error message: Introducing FOREIGN KEY constraint
'FK_dbo.category_dbo.sysuser_category_updated_by' on table 'category'
may cause cycles or multiple cascade paths. Specify ON
DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
Could not create constraint. See previous errors..]
System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +9915300
System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +101
System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr,
HttpContext context) +254
Piranha.Web.ApplicationModule 的 Method Start 似乎有问题。
另外我注意到Entity Framework的配置是:
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
我想知道:
invariantName="System.Data.SqlClient
因为 System.Data.SqlClient 是我的连接字符串中提到的提供程序。但我不知道它是否相关,因为它可能只是意味着 EF 用于检索数据。但我想知道是否可能没有冲突,因为您的内部脚本和 EF 都使用这个连接字符串和这个提到的提供程序。另外,我不确定,但我知道使用代码优先的 EF 在创建数据库时也会创建元数据。也许由于您的内部脚本没有创建它们,EF 认为数据库不存在?
更新 2
我有一些消息,我已经添加了
Database.SetInitializer<Piranha.DataContext>(null);
在 Application_Start 中避免重新创建数据库。它似乎已经解决了数据库重新创建问题。我不再看到有关约束的异常。但是,现在 PageController 在尝试登录后抛出空引用异常,我仍然看不到公共网站的任何页面(公共网站抛出内部服务器错误)。我的猜测是,当我将 Initializer 设置为 null 时,它还会阻止 EF 使用 Framework 的基本数据填充 DB。这是一个很好的步骤,所以问题似乎来自 Piranha DataContext 配置。
更新 3
只是为了提供更多细节:
当我尝试登录时,我被重定向到管理器/页面,正如我之前所说,它会抛出一个空引用异常。当我尝试访问管理器的大部分页面(我尝试过模板/页面列表、设置/用户列表)时,会引发此异常,但是,当我尝试“管理器/发布”时,会出现以下错误:
Invalid object name 'dbo.post'.
Exception Details: System.Data.SqlClient.SqlException: Invalid object name 'dbo.post'.
但“post”表确实存在于数据库中...这是全新安装,我只更改了两件事:连接字符串和我在 Global Asax 中添加的数据库初始化程序代码。
【问题讨论】:
正如我之前提到的,Entity Framework 不应该在数据库中创建表。在没有 __MigrationHistory 表的情况下,使用 EF 映射现有数据库(如 Piranha CMS 中使用的数据库)也没有问题。实体框架也不使用默认数据播种数据库,这也是使用 SqlScripts 完成的。事实上,EF 仅用于终端应用程序的 LINQ 查询接口。 哦,我明白了,谢谢你的解释!我会试试你在更新中的建议 【参考方案1】:据我所知,在 2.2.0 版中,名称为“FK_dbo.category_dbo.sysuser_category_updated_by”的表“类别”没有约束。我想安装新版本时出了点问题。
如果您可以使用管理工具(如“SQLServer Management Studio”)访问 SQL Server,请尝试针对您的 Piranha 数据库运行以下查询:
SELECT *
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE TABLE_NAME='category' AND CONSTRAINT_TYPE='FOREIGN KEY'
您应该会看到三个约束,它们的名称中都没有包含“sysuser”一词。
您可能希望按照此处的说明再次尝试全新安装: http://piranhacms.org/docs/introduction/getting-started
在继续使用 Web 安装程序之前,您应该使用 SQL Server Management Studio 创建一个干净的空数据库。您可以在 Management Studio 中运行这些 SQL 命令:
-- create new user
CREATE LOGIN piranha2 WITH PASSWORD = 'piranha2'
GO
-- create new empty database
CREATE DATABASE piranha2
GO
-- select new database
USE piranha2
GO
-- assign user to database
CREATE USER piranha2 FOR LOGIN piranha2
GO
-- add role to user
EXEC sp_addrolemember 'db_owner', 'piranha2'
GO
之后,打开 Web.config,查找“connectionStrings”部分。你应该看到几行。在此部分中添加一个新行,包含此内容(不要忘记在“server=”之后使用您自己的服务器名或 IP 地址):
<add name="piranha" connectionString="server=192.168.1.1;database=piranha2;user id=piranha2;password=piranha2;multipleactiveresultsets=true;" providerName="System.Data.SqlClient" />
启动安装程序。它应该找到您的数据库并创建表和约束。 希望这会有所帮助。
【讨论】:
感谢杰拉德的四封信!我用 Management Studio 检查了约束,发现了 3 个约束,如你所说:'fk_category_created_by'、'fk_category_permalink_id'、'fk_category_updated_by'。实际上,我已经阅读了您发送给我的链接,我什至浏览了 Github,以及您博客的 cmets,SO,网络……以尝试获取所有可用的相关信息。我创建了至少三个不同的空数据库,我什至卸载并重新安装了 Pihrana。发生的情况是创建了表,但每当我尝试登录时都会遇到此错误。 我没有尝试过的一件事是创建一个新的 MVC 项目来检查它是否解决了问题。我会及时通知你 我刚刚尝试过每一个新鲜的:新鲜项目 + 新鲜数据库,但我仍然得到完全相同的异常。我的生产服务器正在运行 SQLServer 2012【参考方案2】:您提供的错误消息是尝试在数据库中创建 DbContext 时出现的典型实体框架错误。唯一的问题是实体框架不负责在 Piranha CMS 中创建表,这是由框架 dll 中嵌入的内部 SqlScripts 完成的。
如果在数据库中成功创建了表,但在尝试登录时仍然出现此错误,我唯一的猜测是 Entity Framework 出于某种原因使用不正确的连接字符串试图在其他地方创建数据库。虽然我很困惑这怎么会因为配置错误而发生。
安装后可以访问公共站点吗?
更新
我创建了一个新的空白 MVC 应用程序,将 PiranhaCMSMvc 安装到其中,安装了数据库并毫无问题地登录到管理器。我已将空白项目推送到此仓库:
https://github.com/tidyui/Blank
下载此源代码并查看它是否适合您在您修改了连接字符串之后。如果可行,请尝试比较项目以查看导致错误的原因。如果它不起作用,那么您的设置还有其他问题,以某种方式发生冲突。让我更新!
问候
【讨论】:
感谢您的帮助哈坎。我也很困惑,不幸的是我安装后无法访问网站的任何页面。它向我抛出了关于约束错误的相同异常。唯一的解决方案是从头开始一切,然后再次遇到同样的问题。 在杰拉德的帖子之后,我创建了一个新鲜的项目,一切都是新鲜的(数据库等),我唯一改变的是连接字符串。我知道连接字符串没问题,因为我可以在服务器资源管理器中浏览数据库。此外,我可以看到安装第一步之后创建的表。我真的不知道发生了什么事,出乎意料的情况。 我已经更新了我的帖子,问题似乎来自 Piranha.Web.ApplicationModule 的方法开始。 更新了我的答案。请在上面检查! 我已经完成了,不幸的是我收到了关于类别表上的约束的异常错误。我在生产服务器上使用空数据库完成了它。但是,我再次可以看到表已创建。很郁闷,你是在 MSServer 2012 Hakan 上测试的吗?【参考方案3】:在我的例子中,错误的原因是架构名称。
解决方案: 您需要拥有属于 dbo 架构的数据库对象,如果您已安装在具有不同架构名称的新数据库上,则会引发此错误。要修复它,请将这些表的架构名称更改为 dbo,它会像一个魅力一样工作。
【讨论】:
【参考方案4】:嗯,我花了 2 天时间,所以我别无选择,只能更改 CMS。因为这个问题,我迟到了。幸运的是,我只创建了几页。我目前正在搬到 Umbraco。我今天下午玩过它,它实际上没有我听到的那么复杂,所以它应该可以解决问题。它也可以在我的生产服务器上完美运行。
但是,我还有一个项目想保留在 Piranha CMS 上。由于我也计划将它从 Compact SQL 转移到 SQL Server,所以我真的很关心这个问题。
【讨论】:
出于好奇,您的安装是否适用于 SqlCompact 但不适用于 SqlServer?在那种情况下就更奇怪了,我已经在 SqlServer 2003 上部署了 Piranha CMS,直到最新版本和 Azure。 对不起,我没有回复,因为我当时很着急,无法设置虚拟机。现在我有更多的时间。是的,我同意,问题似乎来自环境,但我真的看不出我需要改变什么。它在 SQL Server 2012 下运行。我的另一个项目也遇到了完全相同的问题,这很奇怪。如果您有想法,我很乐意尝试! 是的,就是这样!它与 SqlCompact 完美配合,但使用 SqlServer 时出现此错误。其实我是从SqlServer切换到SqlCompact来尝试调试这个问题 您是否能够在 SQL Server 2012 Hakan 上对其进行测试?通过搬到 Umbraco,我已经能够避免与客户发生大问题,但显然,我对 Pirhana 感到遗憾。 Umbraco 很像 Joomla……我不再使用真正的 ASP.NET,我必须在浏览器中编写所有代码……这在浪费 ASP.NET MVC 的功能和灵活性。我真的很期待解决这个问题,Pirhana 确实是最好的 CMS。 我正在使用 SQL Server 2012 运行多个生产站点,所以这没问题。我仍然对您的错误感到有些困惑,因为我无法重现它并且没有其他人报告过它。一种变通方法总是使用 SqlCompact 创建数据库。然后,您可以编写整个数据库的脚本并在 SQL Server 数据库中创建架构 + 数据。然后只需将连接字符串更改为指向 SQL Server。【参考方案5】:我还不能添加评论,所以必须给出第二个答案: 我之前的回答没有意义,所以我必须和你一起弥补。 如果您仍想调查一段时间: 为了重现您的问题,我使用 Windows 7 Pro-N(未激活)、MS SQL 2012 Express 和 VS 2013 Express Web 创建了 VHD。您可以在 Windows 7 Virtual PC 或 Windows 8 Hyper-V 下将其作为虚拟机运行。使用 Hakan 的空白项目,我无法重现您的问题。但是,如果您设法在此虚拟机中重现您的问题,您可以与 Hakan 共享 VHD,以便他查看正在发生的事情(当然,如果他愿意这样做的话)。 另外,我想知道的是:如果您重命名受影响的表或删除它,错误消息是否会移动到另一个表和/或约束?当然,删除表不是解决方案,但它可能会更多地说明正在发生的事情。
【讨论】:
感谢杰拉德的努力!我无法重现这些错误,而且由于它很可能与环境有关,我非常怀疑它们是否会出现在您的图像中。如果他们这样做,我将非常乐意提供帮助!问候以上是关于执行全新安装 Piranha CMS 时出现外键约束错误的主要内容,如果未能解决你的问题,请参考以下文章