我想将分层文件夹结构保存到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 回答
您不需要任何映射配置 . 模型定义本身足以用于迁移以生成正确的表结构,该表结构将是名为
Id
的PK字段,以及名为ParentId
的可空FK字段 .EF Core中的主要原理与EF 6相同 . 更多信息:http://www.mikesdotnetting.com/article/255/entity-framework-recipe-hierarchical-data-management