2016-08-05 15 views
0

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)
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
1完了ブールsendToPipe、のInt32タイムアウト、ブールasyncWrite、文字列methodNameの)で
System.Data.SqlClient.SqlCommand.ExecuteNonQueryで
() Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationCommandExecutor.ExecuteNonQuery(IEnumerable`1 migrationCommands、IRelationalConnectionでMicrosoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.Execute(IRelationalConnection接続文字列executeMethod、IReadOnlyDictionary 2 parameterValues, Boolean openConnection, Boolean closeConnection)
at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.ExecuteNonQuery(IRelationalConnection connection, IReadOnlyDictionary
2 parameterValues、ブールmanageConnection)で

接続)
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'を使わずにマッピングしてみましたが、データベースからアイテムを読み込むと、子プロパティが設定されていない単一のアイテムとして返されます。

このような種類のデータを保存する正しい方法は何ですか?

+1

なぜエンティティリバースエンジニアとデータベースとマップを作成していませんか?それは簡単になるだろう。 https://visualstudiogallery.msdn.microsoft.com/72a60b14-1581-4b9b-89f2-846072eff19d – Botonomous

+0

私のモデルの開発は変更されますが、主に拡張されるため、手動で更新するのではなく、EFでデータベースを作成する方が望ましいからです。私はEFの新人ですが、これは主にコードファーストのアプローチを学習するためのエクササイズです – RBasniak

+0

その場合、データベースを作成してエンティティツールを使用してリバースエンジニアリングを行い、どこが間違っているかを確認することをおすすめします。 DBスキーマを知らなくても、この質問に答えるのは本当に難しいことです。 – Botonomous

答えて

1

マッピング設定は必要ありません。モデルの定義では、正しいテーブル構造を生成するためのマイグレーションのために十分です。IdというPKフィールドと、ParentIdというヌル可能なFKフィールドがあります。それはより多くの情報についてはEF 6にあるよう

EFコアでこの背後にあるプリンシパルは同じです:http://www.mikesdotnetting.com/article/255/entity-framework-recipe-hierarchical-data-management

関連する問題