2015-07-07 6 views
6

EntityFramework Migracje zapewnia metodę rozszerzenia na DbSet<T>, specjalnie do siewu danych podczas migracji:EF: Czy można używać DbSet <T> .AddOrUpdate() poza migracjami?

void AddOrUpdate<TEntity>(this IDbSet<TEntity> set, params TEntity[] entities); 

Czy to jest bezpieczne w użyciu w „zwykłej” kodu, to znaczy nie do siewu danych podczas migracji?

var blog = ...//detached instance from a request 

using (var context = new BloggingContext()) 
{ 
    context.Blogs.AddOrUpdate(blog); 
    context.SaveChanges(); 
} 

Wydaje się działać prawidłowo, ale zastanawiam się, czy to ma jakieś wady w porównaniu do „tradycyjnych” 'wolnostojący jednostki sceario - jak to opisano, na przykład, on MSDN (ostatnia część artykułu):

using (var context = new BloggingContext()) 
{ 
    context.Entry(blog).State = blog.BlogId == 0 ? 
           EntityState.Added : 
           EntityState.Modified; 

    context.SaveChanges(); 
} 

Odpowiedz

6

Cóż, według Julie Lerman który jest autorytetem w EF, należy używać tylko w AddOrUpdate metody migracji, sprawdź ten blog post:

„to ja Są przeznaczone do użycia przy rozsiewaniu danych podczas migracji. Wygląda to na fajną metodę dodawania do twoich aplikacji, ale to nie jest celem. "

...

pierwsze, będzie to wykonać kwerendy w bazie danych patrząc na rekord gdzie cokolwiek dostarczanego jako kluczowy (pierwszy parametr) jest zgodny z odwzorowaną wartość kolumny (lub wartości) dostarczane w AddOrUpdate. Tak więc ta jest trochę luźna do dopasowywania, ale idealnie nadaje się do wysiewania danych czasowych projektu .

Jak widać, ma dodatkowy koszt, ponieważ przed dodaniem lub aktualizacją wykonuje zapytanie przeszukując, jeśli rekord już istnieje. Najlepszym sposobem jest użycie kodu, o którym wspominasz na końcu postu.

+1

Prawidłowo, nie został zaprojektowany do użytku poza migracjami. – bricelam

+0

Dzięki za link! –

+0

Więc ... jak masz to zrobić? – Izzy

Powiązane problemy