gpt4 book ai didi

entity-framework-core - EF Core - 如何在没有级联删除的情况下配置所需的外键

转载 作者:行者123 更新时间:2023-12-04 07:58:07 32 4
gpt4 key购买 nike

我在一件很简单的事情上遇到了麻烦。 ( Entity Framework 核心 5)
我为派生了几个子类的基本模型编写了以下配置类。
楷模:

abstract public class RecordBase
{
public Guid Id { get; set; }
}

public class Item : RecordBase
{
public string name { get; set; }
}

[NotMapped]
public abstract class LineBase : RecordBase
{
public Guid ItemId { get; set; }
public Item Item { get; set; }
public string Unit { get; set; }
public double Qty { get; set; }
public virtual ICollection<ItemTransaction> ItemTransactions { get; set; } = new Collection<ItemTransaction>();
public virtual ProductDim ProductDim { get; set; }
}

public abstract class OrderLineBase : LineBase
{
public string OrderNum { get; set; }
}

public abstract class JournalLineBase : LineBase
{
public string JournalNum { get; set; }
}

public class SalesOrderLine : OrderLineBase
{
public string CustomerNum { get; set; }
}

public class PurchOrderLine : OrderLineBase
{
public string CustomerNum { get; set; }
}

public class WmsJournalLine : JournalLineBase
{
public string Warehouse { get; set; }
}

public class ItemTransaction : RecordBase
{
public DateTime TransDateTime { get; set; }
public virtual LineBase Line { get; set; }
public string Reference{ get; set; }
}

public class ProductDim : RecordBase
{
public int Configuration { get; set; }
public virtual ICollection<LineBase> LineBases { get; set; }
}
所以我正在定义与 ProductDim Table 的关系,它不能为空。
所以我建立了关系使它 IsRequired()并设置 DeleteBehaviorRestrict .
class LineBaseConfiguration<TEntity> : IEntityTypeConfiguration<TEntity>
where TEntity : LineBase
{
public virtual void Configure(EntityTypeBuilder<TEntity> modelBuilder)
{
modelBuilder.HasOne(x => x.ProductDim)
.WithMany(x => (ICollection<TEntity>)x.LineBases)
.HasForeignKey("ProductDimId")
.IsRequired()
.OnDelete(DeleteBehavior.Restrict);
}
}
该配置将应用于我的 LineBase 的子模型模型:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
...
modelBuilder.ApplyConfiguration<SalesOrderLine>(new LineBaseConfiguration<SalesOrderLine>());
modelBuilder.ApplyConfiguration<WmsJournalLine>(new LineBaseConfiguration<WmsJournalLine>());
modelBuilder.ApplyConfiguration<PurchOrderLine>(new LineBaseConfiguration<PurchOrderLine>());
...
}
现在,当我将迁移添加到我的项目时,外键生成为 ReferentialAction.Cascade .
迁移输出:
migrationBuilder.AddForeignKey(
name: "FK_PurchOrderLine_ProductDim_ProductDimId",
table: "PurchOrderLine",
column: "ProductDimId",
principalTable: "ProductDim",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);

migrationBuilder.AddForeignKey(
name: "FK_SalesOrderLine_ProductDim_ProductDimId",
table: "SalesOrderLine",
column: "ProductDimId",
principalTable: "ProductDim",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);

migrationBuilder.AddForeignKey(
name: "FK_WmsJournalLine_ProductDim_ProductDimId",
table: "WmsJournalLine",
column: "ProductDimId",
principalTable: "ProductDim",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
仅当我删除 IsRequired()从我的模型配置。生成正确的RefrentialAction。但是后来我使外键属性可以为空,这是我必须避免的。
在这种情况下,迁移会生成多个级联路径。所以它是无用的,因为我不能将它应用到我的数据库中。
那么有没有其他方法可以让我的 ForeignKey 字段成为不可为空且正确的删除操作?

最佳答案

我不知道为什么,但是 IsRequired在实体中添加外键。对外键构建器(如 OnDelete )所做的所有修改都不会影响外键,因为它已经构建并添加到实体中。这听起来像一个错误。
解决方案(hack?)是调用 IsRequired终于 :

modelBuilder.HasOne(x => x.ProductDim)
.WithMany(x => (ICollection<TEntity>)x.LineBases)
.HasForeignKey("ProductDimId")
.OnDelete(DeleteBehavior.Restrict)
.IsRequired(); // At last

关于entity-framework-core - EF Core - 如何在没有级联删除的情况下配置所需的外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66596465/

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