一对多导致循环或多个级联路径错误

问题描述 投票:0回答:1

我在开发过程中将Entity Framework Core 3.1.0与SQL Server Express一起使用。

我有一对一的关系和一对多的关系,像这样连接:

Relation --> SupplierSettings --< Conditions

因此RelationSupplierSetting之间存在一对一的关系。在SupplierSettingConditions之间,我有一对多的关系。

这些类的摘录是这样的。

public class Relation
{
    public string GLN { get; set; } 
    public string Name { get; set; }
    public string Country { get; set; } 
}

public class SupplierImportSetting 
{
    public Relation Supplier { get; set; }
    public int SupplierId { get; set; }

    public int MinimumMarginPercentage { get; set; }
    public bool OnlyImportWithConditions { get; set; }

    public ICollection<SupplierCondition> Conditions { get; set; }
}

public class SupplierCondition 
{
    public SupplierImportSetting SupplierImportSetting { get; set; }
    public int SupplierImportSettingId { get; set; }

    public string DiscountGroup { get; set; }
    public string SupplierTradeItemCode { get; set; }
    public string Description { get; set; }

    public decimal? Discount1Percentage { get; set; } // 1 = 100%
}

我这样配置了上下文:

// One to one where Relation is Principal and SupplierImportSetting is dependent.
modelBuilder.Entity<Relation>()
    .HasOne<SupplierImportSetting>()
    .WithOne(sis => sis.Supplier)
    .HasForeignKey<SupplierImportSetting>(sis => sis.SupplierId)
    .OnDelete(DeleteBehavior.Cascade);

// One to many with SupplierImportSetting as Principal and SupplierCondition as dependent.
modelBuilder.Entity<SupplierImportSetting>()
    .HasMany(sis => sis.Conditions)
    .WithOne(c => c.SupplierImportSetting)
    .HasForeignKey(c => c.SupplierImportSettingId)
    .OnDelete(DeleteBehavior.Cascade);

但我收到此错误:

执行DbCommand失败(11ms)[Parameters = [],CommandType ='Text',CommandTimeout = '30']

ALTER TABLE [SupplierConditions]添加约束[FK_SupplierConditions_SupplierImportSettings_SupplierImportSettingId]外国关键字([SupplierImportSettingId])参考[SupplierImportSettings]([Id]);在DELETE CASADE上

Microsoft.Data.SqlClient.SqlException(0x80131904):在表'SupplierConditions'上引入FOREIGN KEY约束'FK_SupplierConditions_SupplierImportSettings_SupplierImportSettingId'可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。无法创建约束或索引。请参阅先前的错误。

在Microsoft.Data.SqlClient.SqlConnection.OnError(SqlException异常,布尔型breakConnection,Action1 wrapCloseInAction) in E:\agent1\_work\34\s\src\Microsoft.Data.SqlClient\netcore\src\Microsoft\Data\SqlClient\SqlConnection.cs:line 1591 at Microsoft.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action1 wrapCloseInAction)在E:\ agent1_work \ 34 \ s \ src \ Microsoft.Data.SqlClient \ netcore \ src \ Microsoft \ Data \ SqlClient \ SqlInternalConnection.cs:第618行在E. \ agent1_work \ 34 \ s \ src \ Microsoft.Data.SqlClient \ netcore \ src \ Microsoft \ Data \ SqlClient \ TdsParser中的Microsoft.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj,Boolean callerHasConnectionLock,Boolean asyncClose)中。 cs:1169行在Microsoft.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior,SqlCommand cmdHandler,SqlDataReader dataStream,BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj,Boolean&dataReady)在E:\ agent1_work \ 34 \ s \ src \ Microsoft.Data.SqlClient \ netcore \ Microsoft \ Data \ SqlClient \ TdsParser.cs:第1719行在Microsoft.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName,Boolean isAsync,Int32 timeout,Boolean asyncWrite)在E:\ agent1_work \ 34 \ s \ src \ Microsoft.Data.SqlClient \ netcore \ src \ Microsoft \ Data \ SqlClient中\ SqlCommand.cs:第2857行在Microsoft.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource1 completion, Boolean sendToPipe, Int32 timeout, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry, String methodName) in E:\agent1\_work\34\s\src\Microsoft.Data.SqlClient\netcore\src\Microsoft\Data\SqlClient\SqlCommand.cs:line 1395 at Microsoft.Data.SqlClient.SqlCommand.ExecuteNonQuery() in E:\agent1\_work\34\s\src\Microsoft.Data.SqlClient\netcore\src\Microsoft\Data\SqlClient\SqlCommand.cs:line 974 at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteNonQuery(RelationalCommandParameterObject parameterObject) at Microsoft.EntityFrameworkCore.Migrations.MigrationCommand.ExecuteNonQuery(IRelationalConnection connection, IReadOnlyDictionary2 parameterValues)在Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationCommandExecutor.ExecuteNonQuery(IEnumerable`1 migrationCommands,IRelationalConnection连接)在Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.Migrate(String targetMigration)在Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.UpdateDatabase(String targetMigration,String contextType)在Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabaseImpl(String targetMigration,String contextType)在Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabase。<> c__DisplayClass0_0。<.ctor>b__0()在Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)

ClientConnectionId:3563e9af-ca34-45dc-a3aa-76394f5cfcbd错误号:1785,状态:0,类别:16在表“ SupplierConditions”上引入FOREIGN KEY约束“ FK_SupplierConditions_SupplierImportSettings_SupplierImportSettingId”可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。无法创建约束或索引。请参阅先前的错误。

实际上,SQL Server可能是正确的,因为当我删除Relation实体时,这将导致级联级联删除。但这就是我想要的。 Relation是主体,因此应删除其他记录。

所以我想,也许我也需要定义一对一关系的另一种方式。当我将其添加到我的上下文配置中时,迁移运行并执行而没有错误。但是,当我检查数据库时,在SupplierImportSettings上创建的约束没有ON DELETE。因此,当我删除一个Relation实体时,SupplierImportSettings不会被删除。那不是我想要的。

// SupplierImportSetting is principal, Relation is dependent.
// Define one to one the other way to disable cascade delete in this direction.
modelBuilder.Entity<SupplierImportSetting>()
    .HasOne<Relation>(sis => sis.Supplier)
    .WithOne()
    .OnDelete(DeleteBehavior.NoAction);

无论我如何尝试,都无法获得Entity Framework Core来创建所需的情况。

我在开发过程中将Entity Framework Core 3.1.0与SQL Server Express一起使用。我有一个这样的一对一关系和一对多关系:Relation-> ...

c# .net sql-server entity-framework-core
1个回答
1
投票

我看到,在删除SupplierSettings时,如何配置关系将导致条件的删除。这将导致删除其他SupplierSettings,这是错误的。可能这就是失败的原因。

© www.soinside.com 2019 - 2024. All rights reserved.