Skip to content

ChangeEntityState

Marcin Sulecki edited this page Mar 28, 2017 · 2 revisions

Attach

            using (var context = new MusicStoreContext())
            {
                context.Albums.Attach(album);
 
                context.Entry<Album>(album).State = EntityState.Modified;
 
                context.SaveChanges();
            }

Porada: warto stosować w przypadku usług sieciowych

W przypadku EF 6.x wywołanie metody DbSet.Add() powoduje wyszukiwanie wszystkich referencji encji w Navigation Property. Jeśli jakieś encje zostaną znalezione i nie są jeszcze śledzone przez Context również są oznaczone jako added.

DbSet.Attach() ma to samo działanie za wyjątkiem takim, że wszystkie encje oznaczone są jako unchaged.

Zapis odłączonej encji z użyciem biblioteki GraphDiff

PM> Install-Package RefactorThis.GraphDiff
private static void GraphDiffTest()
        {
            Artist artist = new Artist { ArtistId = 1, FirstName = "The Artist Formerly Known as Prince" };
 
            using (var context = new MusicStoreContext())
            {
                context.UpdateGraph<Artist>(artist, map => map
                       .OwnedCollection(p => p.Albums));
               
                context.SaveChanges();
            }
        }

http://blog.brentmckendrick.com/introducing-graphdiff-for-entity-framework-code-first-allowing-automated-updates-of-a-graph-of-detached-entities/

EF Core

W EF Core to zostało zmienione.

  • główna encja (root) jest zawsze w żądanym stanie (added dla DbSet.Add i uchanged dla DbSet.Attach)
  • dla encji, które zostaną odnalezione podczas rekursywnego przeszukiwania w navigation property stosowanie jest następująca reguła:
    • jeśli primary key jest generowany przez bazę danych

Na podst. https://docs.microsoft.com/en-us/ef/efcore-and-ef6/porting/ensure-requirements

Clone this wiki locally