我在两个实体之间有这种关系:
符号(=交换定义)引用安全性:
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;
}
谢谢!
答案 0 :(得分:1)
这种行为的原因可能是securityAggregate.State
与dbContext
断开连接。 Issue and various solutions are described在Julie Lerman的博客中详细介绍。您需要使用外键将符号和安全性绑定在一起,或者执行Attach()
以便上下文来重新获取现有实体,而不是尝试添加整个对象图:
this.dbContext.Securities.Attach(Symbol.State.Security);
var addedSymbol = this.dbContext.Symbols.Add(Symbol.State);
this.dbContext.SaveChanges();