powered by simpleCommunicator - 2.0.33     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Странное поведение EF
6 сообщений из 6, страница 1 из 1
Странное поведение EF
    #40046996
senglory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот есть такой код:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
[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 я не могу.
...
Рейтинг: 0 / 0
Странное поведение EF
    #40047000
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
senglory
Я могу к ctx.Transactions добавить AsNoTracking - пофигу, ошибка остается.
поздно добавлять именно тут. Нужно добавлять там, где они загружаются в контекст.

Но это все костыли. Не должно быть разных сущностей с одинаковым ID, потому что теряется вообще всякий смысл ID
...
Рейтинг: 0 / 0
Странное поведение EF
    #40047003
senglory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

Про "Не должно быть разных сущностей с одинаковым ID, потому что теряется вообще всякий смысл ID" - это не ко мне. Это мне такое скармливают, и я над этим не властен от слова никак. Я могу только проигнорить такое добавление или превратить его в апдейт . Так как мне находить таких дважды добавленных?
...
Рейтинг: 0 / 0
Странное поведение EF
    #40047021
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А тебе нужно искать в пределах сеанса до сохранения в базу? Или каждый раз и в базе тоже? И что с параллельностью, то есть может кто-то параллельно добавлять записи в другом контексте?

Сейчас ты ищешь только в базе, но не в трекере.
Можно отдельно поискать в трекере.
Но если точка добавления только одна, я бы просто сделал HashSet с добавлеными ID-шниками и проверял по нему, а очищать его в момент сохранения контекста в базу.
...
Рейтинг: 0 / 0
Странное поведение EF
    #40047070
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
senglory
В коллекцию lstTrans пришло несколько транзакций, ранее не находившихся в базе и при этом с одинаковым TranID.
Как такое может быть, если у тебя TranID заявлен как ключ?
senglory
Разумеется, повлиять на содержимое lstTrans я не могу.
А придется. Почему просто не отфильтровать lstTrans так чтобы все TranID были уникальны?
...
Рейтинг: 0 / 0
Странное поведение EF
    #40047333
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
senglory
Я могу к ctx.Transactions добавить AsNoTracking - пофигу, ошибка остается. Как ее устранить? Разумеется, повлиять на содержимое lstTrans я не могу.


Не добавлять в контекст сущности с одинаковыми ID.

Что ж тут сложного?
Это как квадратное в круглое засовывать удивляться -- о чо ж оно не лезет-то? А что делать? :)
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Странное поведение EF
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]