首页 文章

在Entity Framework Core中建模文件夹结构

提问于
浏览
0

我想将分层文件夹结构保存到SQL数据库中 . 这堂课想这样:

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

我正在尝试使用Entity Framework Core映射它:

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.TdsParser.TryRun上System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj,Boolean callerHasConnectionLock,Boolean asyncClose)中的System.Data.SqlClient.SqlConnection.OnError(SqlException异常,Boolean breakConnection,Action1 wrapCloseInAction) (在System.Data.SqlClient.SqlCommand中的System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName,Boolean async,Int32 timeout,Boolean asyncWrite)中的RunBehavior runBehavior,SqlCommand cmdHandler,SqlDataReader dataStream,BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj,Boolean&dataReady) .InternalExecuteNonQuery(TaskCompletionSource1完成,Boolean sendToPipe,Int32超时,布尔asyncWrite,String methodName)位于Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.Execute的System.Data.SqlClient.SqlCommand.ExecuteNonQuery()中(IRelationalConnection连接,String executeMethod,IReadOnlyDictionary2) parameterValues,Boolea n openConnection,Boolean closeConnection)at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.ExecuteNonQuery(IRelationalConnection connection,IReadOnlyDictionary2 parameterValues,Boolean manageConnection)at Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationCommandExecutor.ExecuteNonQuery(IEnumerable`1 migrationCommands,IRelationalConnection connection)at at Microsoft.EntityFrameworkCore.Tigns.MigrationsOperations.UpdateDatabase(String targetMigration)中的Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.Migrate(String targetMigration),Microsoft.EntityFrameworkCore.Tools.Cli.DatabaseUpdateCommand . <> c__DisplayClass0_0.b__0()在Microsoft.EntityFrameworkCore.Tools.Cli.Program.Main(String [] args)的Microsoft.Extensions.CommandLineUtils.CommandLineApplication.Execute(String [] args)ClientConnectionId:f0c08167-fba7-4afa-baf0-45909e9a1f4b错误号码:1785,状态:0,类:16引入FOREIGN KEY约束'FK_Folders_Folders_Par ent'd'on table'Folders'可能导致循环或多个级联路径 . 指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束 . 无法创建约束或索引 . 查看以前的错误 .

我也尝试在没有'Relation 2'的情况下映射它,它可以工作,但是当我从数据库加载项目时,它们作为单个项目返回,而未设置Children属性 .

存储此类数据的正确方法是什么?

1 回答

相关问题