2017-11-27 15 views
0

동일한 요청 및 컨트롤러에 두 개의 동일한 개체 인스턴스를 추가하려고합니다. 나는 이것이 꽤 일반적으로 작동하는 것처럼 느낀다. 그러나 EF Core는 이것에 문제가있는 것처럼 보인다. 회계 시스템에서 일하고 있는데 항상 2 건의 거래가 기록되어 있습니다.EF 코어 컨트롤러에서 동일한 개체의 두 인스턴스 추가 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); 

    } 

첫 번째는 잘 작동하지만 2 트랜잭션을 추가하려고하면, 나는 오류 얻을 :

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의 버그 일지 모르지만, 나는 잃어 버렸다. 내 초기 "Trade"엔티티에 대한 쿼리에 AsNoTracking()을 추가하려고했지만 여전히 동일한 문제가 있습니다. 재미있는 것은 코드 우선 EF 프로젝트로 시작했지만 데이터베이스를 스캐 폴딩하여 데이터베이스로 먼저갔습니다. 코드 우선 접근 방식으로 모든 것이 잘 작동했습니다. 나는 이것이 어딘가의 맥락에 있어야한다고 생각한다.

답변

1

은 어쩌면 당신은

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

(당신의 조각에서 누락)으로 설정했지만

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

을 생략 한 그리고 같은 DB의 두 인스턴스 사이에 병합 I를 필요한 경우도 두통을 피하기 위해 ' IdGuid이 아니며 int이 아닙니다.

+0

스캐 폴드처럼 내 ID를 기본적으로 ValueGeneratedNever()로 설정합니다. Mysql 라이브러리와 관련이 있어야합니다. ValueGeneratedOnAdd를 추가하는 것이 트릭을 만들었습니다! – a2ron44

+0

또한 Guid를 사용하는 것을 좋아하지만, MySQL은 더 큰 데이터 세트에서 이것을 잘 처리하지 못하므로 int를 사용해야합니다. – a2ron44