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