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

时间:2015-06-23 13:44:35

标签: c# entity-framework entity-framework-6

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

符号(=交换定义)引用安全性:

    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. 将新符号插入数据库。
  4. 步骤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;
        }
    

    谢谢!

1 个答案:

答案 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();