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 に問題があるようです。

また、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 は DB が存在しないと見なしますか?

更新 2

私はいくつかのニュースを持っています、私は追加しました

Database.SetInitializer<Piranha.DataContext>(null);

Application_Start で、データベースの再作成を回避します。データベースの再作成の問題は解決したようです。制約に関する例外は表示されなくなりました。ただし、ログインしようとした後、PageController は null 参照例外をスローし、公開 Web サイトのページはまだ表示されません (公開サイトは内部サーバー エラーをスローします)。私の推測では、Initializer を null に設定すると、EF がフレームワークの基本データを DB に取り込むこともできなくなります。これは良い一歩なので、問題は Piranha DataContext 構成にあるようです。

アップデート 3

詳細を説明するだけです:

ログインしようとすると、前に述べたように null 参照例外をスローするマネージャー/ページにリダイレクトされます。この例外は、マネージャーのほとんどのページにアクセスしようとするとスローされますが (テンプレート/ページリスト、設定/ユーザーリストを試しました)、「マネージャー/投稿」を試みると、次のエラーが発生します。

Invalid object name 'dbo.post'.  
Exception Details: System.Data.SqlClient.SqlException: Invalid object name 'dbo.post'.

しかし、「post」テーブルはデータベースに存在します...これは新規インストールです。変更したのは、接続文字列と、Global Asax に追加したデータベース初期化コードの 2 つだけです。

4

5 に答える 5

1

あなたが提供しているエラーメッセージは、データベースに DbContext を作成しようとしたときの典型的な Entity Framework エラーです。唯一の問題は、Entity Framework が Piranha CMS でテーブルを作成する責任を負わないことです。これは、フレームワーク dll に埋め込まれた内部 SqlScripts によって行われます。

データベースでテーブルが正常に作成され、ログインしようとするとこのエラーが引き続き発生する場合、私の唯一の推測は、Entity Framework が何らかの理由で間違った接続文字列を使用してデータベースを別の場所に作成しようとしているということです。構成の誤りによってこれがどのように発生するのか、私は困惑していますが。

インストール後、公開サイトにアクセスできますか?

アップデート

新しい空の MVC アプリケーションを作成し、そこに PiranhaCMSMvc をインストールし、データベースをインストールして、マネージャーに問題なくログインしました。空のプロジェクトをこのレポにプッシュしました。

https://github.com/tidyui/Blank

このソース コードをダウンロードして、接続文字列を変更した後に動作するかどうかを確認してください。うまくいく場合は、プロジェクトを比較して、エラーの原因を確認してください。うまくいかない場合は、セットアップに何らかの問題があり、何らかの形で競合しています。何かあったらすぐ知らせて!

よろしく

于 2014-05-01T20:32:52.397 に答える
1

私が見る限り、バージョン 2.2.0 では、「FK_dbo.category_dbo.sysuser_category_updated_by」という名前のテーブル「category」に対する制約はありません。新しいバージョンのインストールで何か問題が発生したと思います。

管理ツール (「SQLServer Management Studio」など) を使用して SQL サーバーにアクセスできる場合は、Piranha データベースに対して次のクエリを実行してみてください。

SELECT *
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE TABLE_NAME='category' AND CONSTRAINT_TYPE='FOREIGN KEY'

3 つの制約が表示されますが、名前に「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 に答える
0

私の場合、エラーの理由はスキーマ名です。

解決策: dbo スキーマに属するデータベース オブジェクトが必要です。別のスキーマ名で新しいデータベースにインストールした場合、このエラーがスローされます。それを修正するには、それらのテーブルのスキーマ名を dbo に変更すると、魅力的に機能します。

于 2014-10-28T02:25:54.533 に答える