[Table("IncomingTransactions",Schema ="demo")]
public class Transactions
{
[Key]
[Column("tranId")]
[MaxLength(12)]
public string TranID { get; set; }
public class FamilyTeamSvcDbContext : DbContext
{
public DbSet<Transactions> Transactions { get; set; }
foreach (var tr in lstTrans)
{
var transactionAreadyInDB = ctx.Transactions
.Where(x => x.TranID == tr.TranID ).Any();
if (transactionAreadyInDB)
{
continue;
}
ctx.Transactions.Add(tr);
В коллекцию lstTrans пришло несколько транзакций, ранее не находившихся в базе и при этом с одинаковым TranID. В итоге, на последней строке я ловлю воттакую ошибку:
System.InvalidOperationException: The instance of entity type 'Transactions' cannot be tracked because another instance with the same key value for {'TranID'} is already being tracked. When attaching existing entities, ensure that only one entity instance with a given key value is attached. Consider using 'DbContextOptionsBuilder.EnableSensitiveDataLogging' to see the conflicting key values.
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.IdentityMap`1.ThrowIdentityConflict(InternalEntityEntry entry)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.IdentityMap`1.Add(TKey key, InternalEntityEntry entry, Boolean updateDuplicate)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.StartTracking(InternalEntityEntry entry)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.InternalEntityEntry.SetEntityState(EntityState oldState, EntityState newState, Boolean acceptChanges, Boolean modifyProperties)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.EntityGraphAttacher.PaintAction(EntityEntryGraphNode`1 node)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.EntityEntryGraphIterator.TraverseGraph[TState](EntityEntryGraphNode`1 node, Func`2 handleNode)
at Microsoft.EntityFrameworkCore.Internal.InternalDbSet`1.Add(TEntity entity)
Я могу к ctx.Transactions добавить AsNoTracking — пофигу, ошибка остается. Как ее устранить? Разумеется, повлиять на содержимое lstTrans я не могу.
Здравствуйте, senglory, Вы писали:
S>Я могу к ctx.Transactions добавить AsNoTracking — пофигу, ошибка остается. Как ее устранить? Разумеется, повлиять на содержимое lstTrans я не могу.
S>>Я могу к ctx.Transactions добавить AsNoTracking — пофигу, ошибка остается. Как ее устранить? Разумеется, повлиять на содержимое lstTrans я не могу.
AA>AsNoTracking()
Здравствуйте, senglory, Вы писали:
S>>>Я могу к ctx.Transactions добавить AsNoTracking — пофигу, ошибка остается. Как ее устранить? Разумеется, повлиять на содержимое lstTrans я не могу.
AA>>AsNoTracking()
S>Так я же говорю — пофигу, ошибка остается той же.
Здравствуйте, senglory, Вы писали:
S>В коллекцию lstTrans пришло несколько транзакций, ранее не находившихся в базе и при этом с одинаковым TranID.
Но это поле у тебя помечено как [Key], а значит должно быть уникальным.
Либо убрать ключ вообще, либо, если надо импортировать какие-то внешние сущности, то для них стоит делать другой класс, где это поле неключевое и затем трансформировать одно в другое с назначением нового, уникального TranID
[Skip]
S>Я могу к ctx.Transactions добавить AsNoTracking — пофигу, ошибка остается. Как ее устранить? Разумеется, повлиять на содержимое lstTrans я не могу.
Ух уж эти EF филы.
Разъясняю по пальцам. Скорее всего ты этот контекст держишь слишком долго, например синглтоном и там уже есть объект с таким ключом. Кстати плохая практика. Чем дольше программа работает — тем она тормознутей. Пересоздавай контекст на каждый отдельный переосмысленный чих.
Но и здесь есть выход. Надо не Any а Find
foreach (var tr in lstTrans)
{
var transactionAreadyInDB = ctx.Transactions.Find(tr.TranID);
if (transactionAreadyInDB != null)
{
continue;
}
ctx.Transactions.Add(tr);
}
S>В коллекцию lstTrans пришло несколько транзакций, ранее не находившихся в базе и при этом с одинаковым TranID. В итоге, на последней строке я ловлю воттакую ошибку:///
Ты пытаешься добавить несколько разных записей с одинаковым ключом. Ты какое поведение ожидаешь?