2016-08-05 80 views
0

我想將分層文件夾結構保存到SQL數據庫中。類會是這樣的:在Entity Framework Core中建模文件夾結構

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; } 
} 

我試圖使用實體框架的核心,以映射它:

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); 

如果我嘗試更新數據庫,我得到以下異常:

System.Data.SqlClient.SqlException:在表'文件夾'中引入FOREIGN KEY約束'FK_Folders_Folders_ParentId'可能會導致循環或多個級聯路徑。指定ON DELETE NO ACTION或ON UPDATE 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,字符串方法名)
在System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
在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)
在Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationCommandExecutor.ExecuteNonQuery(IEnumerable`1 migrationCommands,IRelationalConnection連接)
at Microsoft.EntityFrameworkCore.M igrations.Internal.Migrator.Migrate(String targetMigration)
at Microsoft.EntityFrameworkCore.Design.MigrationsOperations.UpdateDatabase(String targetMigration,String contextType)
at Microsoft.EntityFrameworkCore.Tools.Cli.DatabaseUpdateCommand。 <> c__DisplayClass0_0.b__0()
在Microsoft.Extensions.CommandLineUtils.CommandLineApplication.Execute(字串[] args)
在Microsoft.EntityFrameworkCore.Tools.Cli.Program.Main(字串[] args)

ClientConnectionId :f0c08167-fba7-4afa-baf0-45909e9a1f4b
錯誤編號:1785,狀態:0,類別:16

上表 '文件夾' 將外源KEY約束 'FK_Folders_Folders_ParentId' 可能會導致循環或多個級聯路徑。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY約束。 無法創建約束或索引。查看以前的錯誤。

我也試過映射它沒有'關係2',它的工作原理,但然後當我加載數據庫中的項目,他們返回單個項目與兒童財產未設置。

存儲此類數據的正確方法是什麼?

+1

爲什麼不創建數據庫,並與實體逆向工程圖嗎?這會更容易。 https://visualstudiogallery.msdn.microsoft.com/72a60b14-1581-4b9b-89f2-846072eff19d – Botonomous

+0

因爲雖然開發我的模型將被改變,但主要擴展,我寧願讓EF創建數據庫,而不是手動更新它。我也是EF新手,主要是學習Code First方法 – RBasniak

+0

的練習。在這種情況下,我建議創建數據庫,然後使用實體工具進行反向工程,並查看出錯的位置。我們很難在不知道數據庫模式的情況下回答這個問題。 – Botonomous

回答