【发布时间】:2019-02-07 17:31:05
【问题描述】:
模型与其自身具有可选关系
public class Item
{
public Guid Id { get; set; }
public string Description { get; set; }
public Guid StockId { get; set; }
// optionally reference to another item from different stock
public Guid? OptionalItemId { get; set; }
public virtual Item OptionalItem { get; set; }
}
在 DbContext 模型中配置如下:
protected override void OnModelCreating(ModelBuilder builder)
{
builder.Entity<Item>().HasOne(item => item.OptionalItem)
.WithOne()
.HasForeignKey<Item>(item => item.OptionalItemId)
.HasPrincipalKey<Item>(item => item.Id)
.IsRequired(false)
}
我想通过在用新项目更新Stock 之前删除现有项目来用新项目替换现有项目。
// Given Stock contains only new items
public void Update(Stock stock)
{
using (var context = CreateContext())
{
// Remove old items
var oldItems = context.Items
.Where(item => item.StockId == stock.Id)
.Select(item => new Item { Id = item.Id })
.ToList();
context.Items.RemoveRange(oldItems);
// Remove optional items from another stock
var oldOptionalItems = context.Items
.Where(item => item.StockId == stock.RelatedStock.Id)
.Select(item => new Item { Id = item.Id })
.ToList();
context.Items.RemoveRange(oldOptionalItems);
context.Stocks.Update(stock);
context.SaveChanges();
}
}
问题是当Update方法执行时,context.SaveChanges()行抛出异常:
SqlException:DELETE 语句与 SAME TABLE 冲突 REFERENCE 约束 “FK_Item_Item_OptionalItemId”。这 数据库“本地数据库”中发生冲突,表 “dbo.Item”,列“OptionalItemId”。
我发现另一个有类似问题的问题:The DELETE statement conflicted with the SAME TABLE REFERENCE constraint with Entity Framework.
但看起来所有答案都与实体框架(而不是 EF Core)相关。
我尝试将删除行为更改为
- .OnDelete(DeleteBehavior.Cascade)
和
- .OnDelete(DeleteBehavior.SetNull)
但是在将迁移应用到数据库期间,这两种行为都会在下面引发异常。
引入 FOREIGN KEY 约束“FK_Item_Item_OptionalItemId” 表“项目”可能会导致循环或多个级联路径。
指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。
【问题讨论】:
-
尝试在DBContext中为此实体设置
.OnDelete(DeleteBehavior.SetNull) -
@viveknuna,尝试过 - 但将迁移应用到数据库时抛出异常。
-
你遇到了什么异常?
-
@viveknuna,有问题
标签: c# sql-server .net-core entity-framework-core ef-core-2.1