Wchodzę do Entity Framework, ale nie jestem pewien, czy brakuje mi punktu krytycznego w podejściu do kodu.
Używam ogólnego wzorca repozytorium opartego na kodzie z https://genericunitofworkandrepositories.codeplex.com/ i utworzyłem moje jednostki.
Ale kiedy próbuję uzyskać dostęp do podmiotu lub go zmodyfikować, napotykam:
System.InvalidOperationException: Typ jednostki Estate nie jest częścią modelu dla bieżącego kontekstu.
Dzieje się tak, gdy próbuję uzyskać do niego dostęp z mojego repozytorium:
public virtual void Insert(TEntity entity)
{
((IObjectState)entity).ObjectState = ObjectState.Added;
_dbSet.Attach(entity); // <-- The error occurs here
_context.SyncObjectState(entity);
}
Baza danych (./SQLEXPRESS) jest tworzona dobrze, ale jednostki (tabele) po prostu nie są tworzone podczas uruchamiania.
Zastanawiam się, czy muszę jawnie ustawić mapowanie jednostek? Czy EF nie jest w stanie tego zrobić samodzielnie?
Moja jednostka to:
public class Estate : EntityBase
{
public int EstateId { get; set; }
public string Name { get; set; }
}
Mój kontekst jest taki:
public partial class DimensionWebDbContext : DbContextBase // DbContextBase inherits DbContext
{
public DimensionWebDbContext() :
base("DimensionWebContext")
{
Database.SetInitializer<DimensionWebDbContext>(new CreateDatabaseIfNotExists<DimensionWebDbContext>());
Configuration.ProxyCreationEnabled = false;
}
public new IDbSet<T> Set<T>() where T : class
{
return base.Set<T>();
}
}
Czy jest jakiś konkretny powód, dla którego występuje ten błąd? Próbowałem włączyć migracje i włączyć automatyczne migracje bez żadnej pomocy.
źródło
OnModelCreating
jeśli twoje encje są w tym samym zestawie co twójDbContext
. Nigdy jednak nie używałem adnotacji danych dla encji, więc nie mogę powiedzieć na pewno. Zawsze możesz skanować zespoły w swoim zespole,OnModelCreating
aby znaleźć elementy w innych zespołach i zarejestrować je automatycznie (co robi statyw).Najwyraźniej ten błąd jest bardzo ogólny, może mieć wiele przyczyn. W moim przypadku było to następujące: Ciąg połączenia (w pliku Web.config) wygenerowany przez
.edmx
plik był nieprawidłowy. Po prawie dniu próbowania wszystkiego zmieniłem parametry połączenia z ciągu EF na ciąg ADO.NET. To rozwiązało mój problem.Na przykład ciąg EF wygląda mniej więcej tak:
A ciąg ADO.NET wygląda następująco:
Źródło: http://msdn.microsoft.com/nl-nl/data/jj556606.aspx
źródło
EF 4.x
doEF 6
. Musiałem zregenerować parametry połączenia, aby dodać tabelę (DatabaseFirst
). Nie zauważyłem, że moje połączenie wapp.config
i wweb.config
były różne. Kiedy przejąłemconnectionstring
odapp.config
, zaczęło działać.Dla mnie problem polegał na tym, że nie uwzględniłem klasy jednostki w moim zestawie db w kontekście struktury jednostki.
źródło
Możesz spróbować usunąć tabelę z modelu i dodać ją ponownie. Możesz to zrobić wizualnie, otwierając plik .edmx w Eksploratorze rozwiązań.
Kroki:
źródło
Problem może dotyczyć parametrów połączenia. Upewnij się, że parametry połączenia są przeznaczone dla dostawcy SqlClient, bez elementów metadanych związanych z EntityFramework.
źródło
Widziałem ten błąd, gdy istniejąca tabela w bazie danych nie jest odpowiednio odwzorowana na pierwszy model kodu. W szczególności miałem char (1) w tabeli bazy danych i znak w C #. Zmiana modelu na łańcuch rozwiązała problem.
źródło
Mój problem został rozwiązany przez zaktualizowanie części metadanych parametrów połączenia. Najwyraźniej wskazywał na niewłaściwe odniesienie .csdl / .ssdl / .msl.
źródło
Jeszcze jedna rzecz do sprawdzenia w parametrach połączenia - nazwa modelu. Używałem dwóch modeli jednostek, najpierw DB. W konfiguracji skopiowałem połączenie encji dla jednego, zmieniłem jego nazwę i zmieniłem część parametrów połączenia. To, czego nie zmieniłem, to nazwa modelu, więc podczas gdy model jednostki został wygenerowany poprawnie, po zainicjowaniu kontekstu EF szukał w niewłaściwym modelu dla jednostek.
Wygląda na to, że jest zapisane, ale są cztery godziny, na które nie wrócę.
źródło
Dla mnie problem polegał na tym, że użyłem
connection string
wygenerowanego przezADO.Net
Model (.edmx). Zmiana parametrów połączenia rozwiązała mój problem.źródło
Może to również wystąpić, jeśli używasz utrwalonej pamięci podręcznej modelu, która jest nieaktualna z jakiegoś powodu. Jeśli kontekst został zbuforowany w pliku EDMX w systemie plików (za pośrednictwem DbConfiguration.SetModelStore), wówczas OnModelCreating nigdy nie zostanie wywołany, ponieważ zostanie użyta wersja buforowana. W rezultacie, jeśli w magazynie buforowanym brakuje jednostki, wystąpi powyższy błąd, mimo że parametry połączenia są poprawne, tabela istnieje w bazie danych, a jednostka jest poprawnie skonfigurowana w DbContext.
źródło
Przekaz był dość jasny, ale na początku go nie zrozumiałem ...
Pracuję z dwoma kontekstami Entity Framework DB
sysContext
ishardContext
tą samą metodą.Jednostka, którą zmodyfikowałem \ zaktualizowałem, pochodzi z jednego kontekstu, ale potem próbowałem zapisać ją w innym kontekście, w następujący sposób:
ale poprawna wersja powinna wyglądać tak:
Po przekazaniu jednostki do odpowiedniego kontekstu ten błąd zniknął.
źródło
Brzmi oczywiste, ale upewnij się, że nie ignorujesz jawnie tego typu:
modelBuilder.Ignore<MyType>();
źródło
mapa jednostki (nawet pustej) dodana do konfiguracji spowoduje, że typ jednostki będzie częścią kontekstu. Mieliśmy obiekt bez związku z innymi obiektami, który został naprawiony za pomocą pustej mapy.
źródło
jeśli najpierw próbujesz DB, upewnij się, że twoja tabela ma klucz podstawowy
źródło
Wydaje się, że program Visual Studio 2019 powoduje to u mnie. Naprawiłem to, ponownie generując model edmx w 2017 roku.
źródło
Mam ten sam problem w Entity Framewrok i rozwiązałem go, wykonując następujące czynności:
1-Otwórz swój Model.edmx 2-zmień miejsce na stole (do zmiany w pliku cs) 3-zapisz go
Mam nadzieję, że ci pomogę
źródło
Usuń plik .edmx i dodaj go ponownie. Szczególnie, jeśli zaktualizowałeś Entity Framework.
źródło
Miałem ten sam problem z EntityFrameworkCore, próbując zaktualizować zakres wartości.
To podejście nie zadziałało
Po dodaniu metody UpdateRange i usunięciu załączania i wpisywania wszystko działa
źródło
U mnie było to spowodowane tym, że zmieniłem nazwę klasy encji, a kiedy ją wycofałem, było OK.
źródło
To może być głupie, ale jeśli masz ten błąd tylko w jakiejś tabeli, nie zapomnij wyczyścić swojego projektu i przebudować (może to zaoszczędzić dużo czasu)
źródło
Miałem to
To było w metodzie asynchronicznej, ale zapomniałem ustawić await przed GetEntryAsync, więc otrzymałem ten sam błąd ...
źródło