我想將分層文件夾結構保存到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)
1完成後,布爾sendToPipe,的Int32超時,布爾asyncWrite,字符串方法名)
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.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
在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',它的工作原理,但然後當我加載數據庫中的項目,他們返回單個項目與兒童財產未設置。
存儲此類數據的正確方法是什麼?
爲什麼不創建數據庫,並與實體逆向工程圖嗎?這會更容易。 https://visualstudiogallery.msdn.microsoft.com/72a60b14-1581-4b9b-89f2-846072eff19d – Botonomous
因爲雖然開發我的模型將被改變,但主要擴展,我寧願讓EF創建數據庫,而不是手動更新它。我也是EF新手,主要是學習Code First方法 – RBasniak
的練習。在這種情況下,我建議創建數據庫,然後使用實體工具進行反向工程,並查看出錯的位置。我們很難在不知道數據庫模式的情況下回答這個問題。 – Botonomous