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中,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;
}
谢谢!
这种行为的原因可能是securityAggregate.State
与dbContext
断开连接。Julie Lerman博客详细描述了问题和各种解决方案。您需要使用外键将符号和安全性绑定在一起,或者执行Attach()
,以便上下文重新识别现有实体,而不是尝试添加整个对象图:
this.dbContext.Securities.Attach(Symbol.State.Security);
var addedSymbol = this.dbContext.Symbols.Add(Symbol.State);
this.dbContext.SaveChanges();