gpt4 book ai didi

c# - EF Core DeleteBehavior.SetNull 造成循环问题

转载 作者:行者123 更新时间:2023-12-02 07:24:38 30 4
gpt4 key购买 nike

我正在使用 EF Core 1.1.0,并且级联行为存在严重问题。

我有一个名为 Land 的模型,如下所示:

public class Land
{
public long Id { get; set; }
public int HorizontalPosition { get; set; }
public int VerticalPosition { get; set; }
public bool IsPlaced { get; set; }

// Relations
public string UserId { get; set; }
public virtual User User { get; set; }
public long? BuildingId { get; set; }
public virtual Building Building { get; set; }
}

还有另一个名为 Building 的模型,如下所示:

public class Building
{
public long Id { get; set; }
public bool IsPermanent { get; set; }
public int UpgradeCount { get; set; }

// Relations
public string UserId { get; set; }
public virtual User User { get; set; }
public int BuildingTypeId { get; set; }
public virtual BuildingType BuildingType { get; set; }
public virtual List<Land> Lands { get; set; }
}

在 dbcontext 中我提到了这样的关系:

...
modelBuilder.Entity<Land>()
.HasOne(l => l.Building)
.WithMany(b => b.Lands)
.HasForeignKey(l => l.BuildingId)
.OnDelete(Microsoft.EntityFrameworkCore.Metadata.DeleteBehavior.SetNull);
...

但是当我尝试更新数据库时出现此错误:

System.Data.SqlClient.SqlException: Introducing FOREIGN KEY constraint 'FK_Lands_Buildings_BuildingId' on table 'Lands' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
Could not create constraint or index. See previous errors.
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`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 completion, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite, String methodName)
at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.Execute(IRelationalConnection connection, String executeMethod, IReadOnlyDictionary`2 parameterValues, Boolean closeConnection)
at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.ExecuteNonQuery(IRelationalConnection connection, IReadOnlyDictionary`2 parameterValues)
at Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationCommandExecutor.ExecuteNonQuery(IEnumerable`1 migrationCommands, IRelationalConnection connection)
at Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.Migrate(String targetMigration)
at Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.UpdateDatabase(String targetMigration, String contextType)
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabase.<>c__DisplayClass0_1.<.ctor>b__0()
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)
ClientConnectionId:65b8e08e-2d17-46ac-b734-385f88dd07b1
Error Number:1785,State:0,Class:16
Introducing FOREIGN KEY constraint 'FK_Lands_Buildings_BuildingId' on table 'Lands' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
Could not create constraint or index. See previous errors.

生成的迁移是这样的:

...
migrationBuilder.AddForeignKey(
name: "FK_Lands_Buildings_BuildingId",
table: "Lands",
column: "BuildingId",
principalTable: "Buildings",
principalColumn: "Id",
onDelete: ReferentialAction.SetNull);
...

我已经告诉过在删除时将外键设置为空,但它希望我不执行任何操作。尽管在 dbcontext 中没有名为“NoAction”的行为!

behavior options

最佳答案

在 EF Core 版本 2.2.6 中,Microsoft.EntityFrameworkCore.DeleteBehavior 枚举中有 ClientSetNull 条目。

使用 ClientSetNull 而不是 SetNull 对我的情况产生了影响。

我不明白为什么MsSqlServer无法解析多个级联路径,其他引擎完全可以这样做。

关于c# - EF Core DeleteBehavior.SetNull 造成循环问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42856547/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com