2

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 似乎有问题。

另外我注意到实体框架的配置是:

<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 中添加的数据库初始化程序代码。

4

5 回答 5

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" />

启动安装程序。它应该找到您的数据库并创建表和约束。希望这会有所帮助。

于 2014-05-01T19:59:19.937 回答
1

您提供的错误消息是尝试在数据库中创建 DbContext 时的典型实体框架错误。唯一的问题是实体框架不负责在 Piranha CMS 中创建表,这是由框架 dll 中嵌入的内部 SqlScripts 完成的。

如果在数据库中成功创建了表,并且在尝试登录时仍然出现此错误,我唯一的猜测是 Entity Framework 出于某种原因使用不正确的连接字符串试图在其他地方创建数据库。虽然我很困惑如何通过错误配置发生这种情况。

安装后可以访问公共站点吗?

更新

我创建了一个新的空白 MVC 应用程序,将 PiranhaCMSMvc 安装到其中,安装了数据库并毫无问题地登录到管理器。我已将空白项目推送到此仓库:

https://github.com/tidyui/Blank

下载此源代码并在修改连接字符串后查看它是否适合您。如果可行,请尝试比较项目以查看导致错误的原因。如果它不起作用,那么您的设置还有其他问题,以某种方式发生冲突。让我更新!

问候

于 2014-05-01T20:32:52.397 回答
0

在我的情况下,错误原因是架构名称。

解决方案: 您需要拥有属于 dbo 架构的数据库对象,如果您安装在具有不同架构名称的新数据库上,则会抛出此错误。要修复它,请将这些表的模式名称更改为 dbo,它会像魅力一样工作。

于 2014-10-28T02:25:54.533 回答
0

我还不能添加评论,所以必须给出第二个答案:我之前的答案没有意义,所以我必须和你一起弥补。如果您仍想调查一段时间:为了重现您的问题,我使用 Windows 7 Pro-N(未激活)、MS SQL 2012 Express 和 VS 2013 Express Web 创建了 VHD。您可以在 Windows 7 Virtual PC 或 Windows 8 Hyper-V 下将其作为虚拟机运行。使用 Hakan 的空白项目,我无法重现您的问题。但是,如果您设法在此虚拟机中重现您的问题,您可以与 Hakan 共享 VHD,以便他查看正在发生的事情(当然,如果他愿意这样做的话)。另外,我想知道的是:如果您重命名受影响的表或删除它,错误消息是否移动到另一个表和/或约束?当然,删除表不是解决方案,但它可能会更多地说明正在发生的事情。

于 2014-05-05T09:52:00.967 回答
0

好吧,我花了 2 天时间,所以我别无选择,只能更改 CMS。因为这个问题,我迟到了。幸运的是,我只创建了几页。我目前正在搬到 Umbraco。我今天下午玩过它,它实际上没有我听到的那么复杂,所以它应该可以解决问题。它也可以在我的生产服务器上完美运行。

但是,我还有一个项目想保留在 Piranha CMS 上。由于我也计划将它从 Compact SQL 转移到 SQL Server,所以我真的很关心这个问题。

于 2014-05-02T18:54:45.117 回答