2017-11-27 4 views
0

同じ要求とコントローラに同じオブジェクトの2つのインスタンスを追加しようとしています。私はこれがかなり一般的な操作だと思っていますが、EF Coreにはこれに問題があるようです。私はあなたが常に2つのトランザクションを記録している会計システムに取り組んでいます。EFコアコントローラ内の同じオブジェクトの2つのインスタンスを追加するSystem.InvalidOperationException

private void AddLedgersForTrade(Trade trade) 
    { 

     decimal TradeTranFee = 0; 
     decimal ForTranFee = 0; 

     if(trade.TradeCoinId == trade.FeeCoinId){ 
      TradeTranFee = trade.Fee; 
     } else { 
      ForTranFee = trade.Fee; 
     } 
     var ledger1 = new LedgerTransaction{ 
      TransactionId = trade.TransactionId, 
      TransactionDate = trade.TradeDate, 
      ExchangeId = trade.FromExchangeId, 
      CoinId = trade.TradeCoinId, 
      Amount = trade.TradeAmount * -1, 
      ExchangeRate = 1, 
      Fee = TradeTranFee, 
      LastUpdate = trade.LastUpdate, 
      TradeId = trade.Id, 
      Owner = trade.Owner 
     }; 
     var ledger2 = new LedgerTransaction{ 
      TransactionId = trade.TransactionId, 
      TransactionDate = trade.TradeDate, 
      ExchangeId = trade.ToExchangeId, 
      CoinId = trade.ForCoinId, 
      Amount = trade.ForAmount, 
      ExchangeRate = trade.ExchangeRate, 
      Fee = ForTranFee, 
      LastUpdate = trade.LastUpdate, 
      TradeId = trade.Id, 
      Owner = trade.Owner 
     }; 

     ledgerRepository.AddLedgerTransaction(ledger1); 
     ledgerRepository.AddLedgerTransaction(ledger2); 

    } 

最初は正常に動作しますが、それは第二のトランザクションを追加しようとしたら、私はエラーを取得:

modelBuilder.Entity<LedgerTransaction>(entity => 
     { 

      entity.HasIndex(e => e.CoinId); 

      entity.HasIndex(e => e.ExchangeId); 

      entity.HasIndex(e => e.IsManual); 

      entity.HasIndex(e => e.Owner); 

      entity.HasIndex(e => e.TradeId); 

      entity.Property(e => e.Id).ValueGeneratedNever(); 

      entity.Property(e => e.ExchangeId).HasDefaultValueSql("'0'"); 

      entity.Property(e => e.IsManual).HasDefaultValueSql("'b\\'0\\''"); 

      entity.Property(e => e.LastUpdate).HasDefaultValueSql("'0001-01-01 00:00:00'"); 
     }); 

System.InvalidOperationException: The instance of entity type 'LedgerTransaction' cannot be tracked because another instance with the key value 'Id:0' is already being tracked. When attaching existing entities, ensure that only one entity instance with a given key value is attached. at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.IdentityMap`1.Add(TKey key, InternalEntityEntry entry) ....

私のコンテキストとして、このエンティティの設定です私はこれがEF Core 2.0.xのバグかもしれないと読んでいますが、私は迷っています。私は最初の "貿易"エンティティのクエリにAsNoTracking()を追加しようとしましたが、同じ問題があります。面白いことに、私はコードファーストのEFプロジェクトとして始めましたが、その後、データベースを足場にしてデータベースを先に進めました。コードファーストのアプローチですべてうまくいきました。私はこれが文脈のどこかにあるに違いないと思っています。

答えて

1

たぶん、あなたは

builder.Entity<Ledger>().HasKey(e => e.Id); 

(スニペットから欠落)が設定されているが、同じデシベルの2つのインスタンス間のマージがI必要な場合は頭痛の種を避けるために、また

builder.Entity<Ledger>().Property(e => e.Id).ValueGeneratedOnAdd(); 

を省略しています'IdGuidではなく、intになります。

+0

スカフォールドのように、私のIDをValueGeneratedNever()に設定するのがデフォルトです。 Mysqlライブラリに関連している必要があります。 ValueGeneratedOnAddを追加することはトリックでした! – a2ron44

+0

Guidも使いたいですが、Mysqlは大規模なデータセットでこれをうまく処理しないので、今のところintに固執します。 – a2ron44

関連する問題