EF尝试第二次添加添加的项目

本文关键字:添加 项目 第二次 EF | 更新日期: 2023-09-27 17:59:05

我在两个实体之间有这样的关系:

一个符号(=交易所定义)引用一种证券:

    public partial class Symbol : BaseDto
{
    ...
    private int _SecurityId;
    /// <summary>
    ///  Gets or sets the SecurityId
    /// </summary>
    public int SecurityId { get { return this._SecurityId; } set { this.SetProperty(ref this._SecurityId, value); } }
    ...
    public virtual Security Security { get; set; }
}

我想做以下事情:

  1. 在数据库中插入新的安全性
  2. 创建新的符号,使用刚插入数据库的安全性参考更新符号
  3. 将新符号插入数据库

步骤1和步骤2运行良好。然而,在步骤3中,EF想要第二次插入已经插入的安全性,并且抛出密钥违反异常。

知道EF为什么不知道安全性已经插入数据库吗?安全的Id标识值设置正确。

这里有一些代码。

单元测试中的代码段,我调用存储库来保存实体,并用保存的安全性改写符号:

securityAggregate = securityRepository.AddSecurityAsync(securityAggregate).Result;
symbolAggregate.State.Security = securityAggregate.State;
symbolAggregate = symbolRepository.AddSymbolAsync(symbolAggregate).Result;

这是发生异常的符号存储库,因为EF试图第二次插入安全性:

    public async Task<SymbolAggregate> AddSymbolAsync(SymbolAggregate Symbol)
    {
        var SymbolAggregate = await Task.Run<SymbolAggregate>(
            () =>
            {
                var addedSymbol = this.dbContext.Symbols.Add(Symbol.State);
                this.dbContext.SaveChanges();
                return new SymbolAggregate { State = addedSymbol };
            };
        return SymbolAggregate;
    }

谢谢!

EF尝试第二次添加添加的项目

这种行为的原因可能是securityAggregate.StatedbContext断开连接。Julie Lerman博客详细描述了问题和各种解决方案。您需要使用外键将符号和安全性绑定在一起,或者执行Attach(),以便上下文重新识别现有实体,而不是尝试添加整个对象图:

this.dbContext.Securities.Attach(Symbol.State.Security);
var addedSymbol = this.dbContext.Symbols.Add(Symbol.State);
this.dbContext.SaveChanges();