EF core wstawienie rekordu dziecka za pomocą parent rekordu

1

Witam. Mam skonfigurowaną relecje w EF core 3.1 one to many. Moje modele nie są anemiczne więc wszystko jest protected (rownież kolekcje, coś tak jak tutaj: https://www.thetopsites.net/article/58042652.shtml). I np mam model Company a w nim kolekcje Departments. Przy tworzeniu Company jak dodam department do kolekcji w obiekcie Company to obie wartości zapisują się do bazy. Problem mam przy dodaniu tylko Department przez obiekt nadrzędny Company. Pobieram sobię Company. robie company.AddDepartment(Departmen) save changesasync i leci exception
"Database operation expected to affect 1 row(s) but actually affected 0 row(s). Data may have been modified or deleted since entities were loaded. See http://go.microsoft.com/fwlink/?LinkId=527962 for information on understanding and handling optimistic concurrency exceptions."

I nie bardzo wiem czemu. Ustawiłem fk, pk. ale błąd się zawsze pojawia.

Gdy tak samo utworzony obiekt Department dodaje przez dbseta nie ma problemów.

1

o, to ten błąd :D

Przejrzałem breaking changes, ale nie mogę nic znaleźć i się zastanawiam o co chodzi

Jestem prawie pewien że kod tego typu działał na EF Core 2.x

var entity = await _context.Shop.Include(x => x.Products).FirstOrDefaultAsync(x => x.Name = "1234");
entity.Products.Add(new Products());
await _context.SaveChangesAsync();

a na 3.1 leci to co @szydlak

"Database operation expected to affect 1 row(s) but actually affected 0 row(s). Data may have been modified or deleted since entities were loaded. See http://go.microsoft.com/fwlink/?LinkId=527962 for information on understanding and handling optimistic concurrency exceptions."

coś się zmieniło, czy ja mam urojenia?

"Naprawiło" zrobienie czegoś takiego:

var entity = await _context.Shop.Include(x => x.Products).FirstOrDefaultAsync(x => x.Name = "1234");
var p = new Products();
entity.Products.Add(p);
await _context.Add(p);
await _context.SaveChangesAsync();

Nie wiem, czasem zrozumienie czego tak naprawdę chcę EF jest tricky af

edit. znalazłem:

Breaking changes included in EF Core 3.0

https://stackoverflow.com/questions/57923422/ef-core-3-0-adding-connected-entity-to-collection-fails-in-one-to-many-relations

0

A to nie czasem dlatego, że nie skonfigurowaliscie, ze klucz jest na przykład
autoinkrentowalnym identity i sobie ta kobyła z tym poradzić nie może?

0

@urke:

Ja testowałem to na czymś tego typu, więc czy Id nie powinno być wydedukowane z konwencji, a wartość już gotowa?

public class Test
{
	public Guid Id { get; private set; } = Guid.NewGuid();
}
2

Nie wiem dokładnie, nie chcę wprowadzać w błąd.
Ale to chyba jest tak, że jak jawnie ustawiasz klucz w modelu i wysylasz do bazy, to ef spodziewa sie znalezc rekord z takim idkiem w bazie.
Jak nie znajduje to wywala ten glupi blad zwiazanym z wielowatkowoscia.

Nie wiem jak to porobilu teraz, pewnie trzrba jawnie to skonfigurować annotacjami albo fluent api jak chcesz sam ustawiac klucz na encji.

Ogólnie za dużo zabawy z ef, juz nie uzywam w pracy na szczęście, utrudnia proste rzeczy.

0

@urke:

Masz rację, właściwie to było napisane w linku który dałem wyżej :D

Starting with EF Core 3.0, if an entity is using generated key values and some key value is set, then the entity will be tracked in the Modified state. This means that a row for the entity is assumed to exist and it will be updated when SaveChanges is called. If the key value isn't set, or if the entity type isn't using generated keys, then the new entity will still be tracked as Added as in previous versions

TIL, dzięki.

0

To zgubiłem trochę wątek. @WeiXiao to jak to powinno być? Bo Czy ustawiam klucze w entity Department czy nie to leci exception. Tylko przy wstawianiu nowego Company z departmentem działa dobrze (nawet jak nie ustawiam Idków na department).
Btw czy jest możliwość ograniczenia ilości dzieci? Np chciałbym aby niektóre Company mialy max jeden department

1

@szydlak:

Spróbuj ręcznie ustawić State encji na Added

1 użytkowników online, w tym zalogowanych: 0, gości: 1