SQLデータベースに階層的なフォルダ構造を保存したいと考えています。Entity Frameworkコアのモデリングフォルダ構造
:私は、データベースを更新しようとした場合、私は次の例外を取得しbuilder.Entity<Folder>() .HasKey(i => i.Id); // Relation 1 builder.Entity<Folder>() .HasMany(e => e.Children) .WithOne(e => e.Parent) .HasForeignKey(e => e.ParentId); // Relation 2 builder.Entity<Folder>() .HasOne(f => f.Parent) .WithMany(f => f.Children) .OnDelete(Microsoft.EntityFrameworkCore.Metadata.DeleteBehavior.Cascade);
:私はEntity Frameworkのコアを使用して、それをマップしようとしている
public class Folder { public Folder() { Children = new List<Folder>(); } public string Name { get; set; } public int Id { get; set; } public int? ParentId { get; set; } public Folder Parent { get; set; } public ICollection<Folder> Children { get; set; } }
:クラスは、このをしたいと思います
System.Data.SqlClient.SqlException:FOREIGN KEY制約 'FK_Folders_Folders_ParentId'を 'Folders'テーブルに導入すると、サイクルまたは複数のカスケードパスが発生することがあります。 NO DELETE NO ACTIONまたはUP UP NO NO ACTIONを指定するか、他のFOREIGN KEY制約を変更してください。制約またはインデックスを作成できませんでした。以前のエラーを参照してください。 System.Data.SqlClient.SqlConnection.OnError(SQLException例外、ブールbreakConnection、アクション
1 wrapCloseInAction)
1完了ブールsendToPipe、のInt32タイムアウト、ブールasyncWrite、文字列methodNameの)で
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
at System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async, Int32 timeout, Boolean asyncWrite)
at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource
System.Data.SqlClient.SqlCommand.ExecuteNonQueryで
() Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationCommandExecutor.ExecuteNonQuery(IEnumerable`1 migrationCommands、IRelationalConnectionでMicrosoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.Execute(IRelationalConnection接続文字列executeMethod、IReadOnlyDictionary2 parameterValues, Boolean openConnection, Boolean closeConnection)
2 parameterValues、ブールmanageConnection)で
at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.ExecuteNonQuery(IRelationalConnection connection, IReadOnlyDictionary
接続)
at Microsoft.EntityFrameworkCore.M igrations.Internal.Migrator.Migrate(文字列targetMigration)Microsoft.EntityFrameworkCore.Tools.Cli.DatabaseUpdateCommandで
Microsoft.EntityFrameworkCore.Design.MigrationsOperations.UpdateDatabase(文字列targetMigration、列contextType)で
。 Microsoft.EntityFrameworkCore.Tools.Cli.Program.Main(文字列[]引数)でMicrosoft.Extensions.CommandLineUtils.CommandLineApplication.Execute(文字列[]引数)
ClientConnectionIdで<> c__DisplayClass0_0.b__0()
:f0c08167-fba7-4afa-baf0-45909e9a1f4b
エラー番号:1785、状態:0、クラス:16は、FOREIGN KEY制約を紹介 'FK_Folders_Folders_ParentId' テーブル 'フォルダ' には、サイクルまたは複数のカスケードパスを引き起こす可能性があります。 NO DELETE NO ACTIONまたはUP UP NO NO ACTIONを指定するか、他のFOREIGN KEY制約を変更してください。 制約またはインデックスを作成できませんでした。以前のエラーを参照してください。
また、 '関係2'を使わずにマッピングしてみましたが、データベースからアイテムを読み込むと、子プロパティが設定されていない単一のアイテムとして返されます。
このような種類のデータを保存する正しい方法は何ですか?
なぜエンティティリバースエンジニアとデータベースとマップを作成していませんか?それは簡単になるだろう。 https://visualstudiogallery.msdn.microsoft.com/72a60b14-1581-4b9b-89f2-846072eff19d – Botonomous
私のモデルの開発は変更されますが、主に拡張されるため、手動で更新するのではなく、EFでデータベースを作成する方が望ましいからです。私はEFの新人ですが、これは主にコードファーストのアプローチを学習するためのエクササイズです – RBasniak
その場合、データベースを作成してエンティティツールを使用してリバースエンジニアリングを行い、どこが間違っているかを確認することをおすすめします。 DBスキーマを知らなくても、この質問に答えるのは本当に難しいことです。 – Botonomous