ef core add with child
От: Разраб  
Дата: 30.10.23 09:25
Оценка:
Ошибка
The instance of entity type 'Assignee' cannot be tracked because another instance with the same key value for {'Id'} is already being tracked.
When attaching existing entities, ensure that only one entity instance with a given key value is attached
из json получаю
class Issue
{
 int id {get;set;}
 Assingee   Assingee {get;set;}
}
class Assingee   
{
 int id {get;set;}
}
...
                db.Issues.Add(entity);


не помню как обойти. Issue новая, Assingee старый

   using var tx = db.Database.BeginTransaction();
            foreach (var x in Issue.Issues)
            {
                var person = db.Persons.Find(x.Assignee!.Id);
                if (person != null)
                    db.Entry(person).CurrentValues.SetValues(x.Assignee);
                else
                    db.Add(x.Assignee);
                db.SaveChanges();
                if (db.Issues.Find(x.Id) is Issue issue)
                    db.Entry(issue).CurrentValues.SetValues(x);
                else
                {
                    if (person != null)
                        x.Assignee = person; //<= так заработало, но как-то криво, хотя и логично, может можно лучше?
                    db.Issues.Add(x);
                }
                db.SaveChanges();
            }
            tx.Commit();
            var id = Issue.Issues.MaxBy(x => x.Id).Id + 1;
            Issue.Issues.Add(new Issue { Id = id, Name = $"Issue {id}", Assignee = Person.Persons[Random.Shared.Next(0, 3)] });
☭ ✊ В мире нет ничего, кроме движущейся материи.
Отредактировано 30.10.2023 12:18 Разраб . Предыдущая версия .
Re: ef core add with child
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 30.10.23 10:14
Оценка:
Здравствуйте, Разраб, Вы писали:

По уму у тебя должно быть описание типа https://infostart.ru/1c/articles/402038/


[Column("_Fld48RRef")]
[Required]
[MaxLength(16)]
public  byte[] РеквизитСправочникId { get; set; }
virtual  public  Справочник.Номенклатура РеквизитСправочник { get; set; }


https://metanit.com/sharp/efcore/3.1.php
и солнце б утром не вставало, когда бы не было меня
Отредактировано 30.10.2023 11:03 Serginio1 . Предыдущая версия . Еще …
Отредактировано 30.10.2023 10:45 Serginio1 . Предыдущая версия .
Отредактировано 30.10.2023 10:42 Serginio1 . Предыдущая версия .
Отредактировано 30.10.2023 10:42 Serginio1 . Предыдущая версия .
Re[2]: ef core add with child
От: Разраб  
Дата: 30.10.23 11:27
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>Здравствуйте, Разраб, Вы писали:


S>По уму у тебя должно быть описание типа https://infostart.ru/1c/articles/402038/



S>
S>[Column("_Fld48RRef")]
S>[Required]
S>[MaxLength(16)]
S>public  byte[] РеквизитСправочникId { get; set; }
S>virtual  public  Справочник.Номенклатура РеквизитСправочник { get; set; }
S>


S>https://metanit.com/sharp/efcore/3.1.php


это все есть, но не смотря использование using var db = ... все равно где-то инстансы сущностей протрэкались.
вот думаю может ServiceLifetime.Transient для db может? обработка в цикле проводится.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[3]: ef core add with child
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 30.10.23 12:31
Оценка:
Здравствуйте, Разраб, Вы писали:


Р>это все есть, но не смотря использование using var db = ... все равно где-то инстансы сущностей протрэкались.

Р>вот думаю может ServiceLifetime.Transient для db может? обработка в цикле проводится.

Ну самое простое подписаться на события и посмотреть откуда ноги растут
https://learn.microsoft.com/ru-ru/dotnet/api/system.data.services.client.entitycollectionchangedparams?view=netframework-4.8.1
и солнце б утром не вставало, когда бы не было меня
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.