동일한 요청 및 컨트롤러에 두 개의 동일한 개체 인스턴스를 추가하려고합니다. 나는 이것이 꽤 일반적으로 작동하는 것처럼 느낀다. 그러나 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 프로젝트로 시작했지만 데이터베이스를 스캐 폴딩하여 데이터베이스로 먼저갔습니다. 코드 우선 접근 방식으로 모든 것이 잘 작동했습니다. 나는 이것이 어딘가의 맥락에 있어야한다고 생각한다.
스캐 폴드처럼 내 ID를 기본적으로 ValueGeneratedNever()로 설정합니다. Mysql 라이브러리와 관련이 있어야합니다. ValueGeneratedOnAdd를 추가하는 것이 트릭을 만들었습니다! – a2ron44
또한 Guid를 사용하는 것을 좋아하지만, MySQL은 더 큰 데이터 세트에서 이것을 잘 처리하지 못하므로 int를 사용해야합니다. – a2ron44