MetadataException: Nie można załadować określonego zasobu metadanych

681

Nagle zaczynam MetadataExceptiontworzyć instancję mojej wygenerowanej ObjectContextklasy. Ciąg połączenia w App.Config wygląda poprawnie - nie zmienił się od czasu ostatniego działania - i próbowałem zregenerować nowy model (plik edmx) z bazowej bazy danych bez żadnych zmian.

Czy ktoś ma jakieś pomysły?

Dalsze szczegóły: Nie zmieniłem żadnych właściwości, nie zmieniłem nazwy żadnych zestawów wyjściowych, nie próbowałem osadzić EDMX w zestawie. Czekałem zaledwie 10 godzin od opuszczenia pracy, aż wrócę. A potem to już nie działało.

Próbowałem odtworzyć EDMX. Próbowałem odtworzyć projekt. Próbowałem nawet odtworzyć bazę danych od zera. W ogóle nie ma szczęścia.

J. Steen
źródło
14
Jeśli pytanie SO dotyczące konkretnego produktu, który ma ponad 200 000 wyświetleń, oznacza to, że produkt nie działa zgodnie z oczekiwaniami użytkowników. Chciałbym zobaczyć, jak Microsoft to rozwiązuje. Oto link do sugestii, jeśli masz czas: visualstudio.uservoice.com/forums/121579-visual-studio .
Tony L.
Mój problem został rozwiązany, zastępując ciąg połączenia skopiowany z projektu warstwy db.
Hardik,

Odpowiedzi:

856

Oznacza to, że aplikacja nie może załadować EDMX. Może to powodować kilka rzeczy.

  • Możliwe, że zmieniono właściwość MetadataArtifactProcessing modelu na Kopiuj do katalogu wyjściowego.
  • Ciąg połączenia może być nieprawidłowy. Wiem, że mówisz, że go nie zmieniłeś, ale jeśli zmieniłeś inne rzeczy (powiedzmy nazwę zgromadzenia), może to być nadal błędne.
  • Być może używasz zadania po kompilacji, aby osadzić EDMX w zestawie, który z jakiegoś powodu już nie działa.

Krótko mówiąc, w twoim pytaniu nie ma wystarczająco dużo szczegółów, aby udzielić dokładnej odpowiedzi, ale mam nadzieję, że te pomysły pomogą ci znaleźć właściwą drogę.

Aktualizacja: Napisałem post na blogu z pełniejszymi instrukcjami rozwiązywania problemów .

Craig Stuntz
źródło
70
Ciąg połączenia, pomimo moich ostatnich prób porównania go z narzędziem do porównywania treści, był nieprawidłowy.
J. Steen,
16
To był także dla mnie ciąg połączenia. Gdy masz testy integracyjne, które również wymagają połączenia ze swoim App.config, rzeczy mogą nie zsynchronizować się podczas aktualizacji edmx.
Ray
11
OK, naprawiłem to po prostu ustawiając „Osadź”; kompilowanie, a następnie resetowanie go do drugiego. To rozwiązało mój problem.
Shimmy Weitzhandler,
6
Miałem ten sam problem, wypróbowałem twoje rozwiązanie, chciałem dać +1, zdałem sobie sprawę, że już to zrobiłem w przeszłości. Nawet wcześniej nie pamiętam tego problemu;). Tym razem w moim przypadku był to poprawny ciąg połączenia w Bibliotece klas z edmx i niepoprawny w aplikacji internetowej, gdy był używany.
Episodex
9
Niesamowity przewodnik. Dla mnie skopiowałem kolejny ciąg połączenia, który używał res: // * / Database.MyModel2 ..., gdy NAPRAWDĘ chciałem res: // * / MyModel1 ... (Baza danych jest folderem w moim projekcie Integration Tests)
emragins
360

Ta mała zmiana pomaga rozwiązać ten problem.

Mam rozwiązanie z 3 projektem.

connectionString="metadata=res://*/Model.Project.csdl|res://*/Model.Project.ssdl|res://*/Model.Project.msl;

zmień na

connectionString="metadata=res://*/;
MicTech
źródło
11
Naprawiłem to dla mnie, ale co to do cholery znaczy?
Lance Fisher
18
@Lance: Wyjaśniam to szczegółowo w tym poście na blogu
Craig Stuntz,
4
@jocull: Nie, w wielu przypadkach nie zadziała, aw innych będzie powolny. Przeczytaj mój post na blogu, aby zrozumieć, dlaczego.
Craig Stuntz
6
Przeniesiłem mój plik .edmx do folderu Model i zapomniałem zaktualizować parametry połączenia. Świetny wskaźnik. Dzięki. Zrozumienie zajęłoby mi wiele godzin.
ogromny
11
Pan uratował biednego pracownika Microsoftu przed bardzo wkurzonym konsumentem.
Muffin Man
115

Możesz uzyskać ten wyjątek, gdy Edmx jest w jednym projekcie i używasz go z innego.

Powodem jest Res://*/to, że uri wskazuje zasoby w zestawie AKTUALNY. Jeśli Edm jest zdefiniowany w innym zestawie niż kod, który go używa, res: // * / nie będzie działać, ponieważ nie można znaleźć zasobu.

Zamiast określać „*”, musisz podać pełną nazwę zestawu (w tym token klucza publicznego). Na przykład:

res://YourDataAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=abcdefabcedf/YourEdmxFileName.csdl|res://...

Lepszym sposobem na konstruowanie parametrów połączenia jest EntityConnectionStringBuilder:

public static string GetSqlCeConnectionString(string fileName)
{
    var csBuilder = new EntityConnectionStringBuilder();

    csBuilder.Provider = "System.Data.SqlServerCe.3.5";
    csBuilder.ProviderConnectionString = string.Format("Data Source={0};", fileName);

    csBuilder.Metadata = string.Format("res://{0}/YourEdmxFileName.csdl|res://{0}/YourEdmxFileName.ssdl|res://{0}/YourEdmxFileName.msl", 
        typeof(YourObjectContextType).Assembly.FullName);

    return csBuilder.ToString();
}

public static string GetSqlConnectionString(string serverName, string databaseName)
{
    SqlConnectionStringBuilder providerCs = new SqlConnectionStringBuilder();

    providerCs.DataSource = serverName;
    providerCs.InitialCatalog = databaseName;
    providerCs.IntegratedSecurity = true;

    var csBuilder = new EntityConnectionStringBuilder();

    csBuilder.Provider = "System.Data.SqlClient";
    csBuilder.ProviderConnectionString = providerCs.ToString();

    csBuilder.Metadata = string.Format("res://{0}/YourEdmxFileName.csdl|res://{0}/YourEdmxFileName.ssdl|res://{0}/YourEdmxFileName.msl",
        typeof(YourObjectContextType).Assembly.FullName);

    return csBuilder.ToString();
}

Jeśli nadal występuje wyjątek, otwórz zespół w reflektorze i sprawdź nazwy plików dla plików .csdl, .ssdl i .msl. Gdy zasoby mają inne nazwy niż te określone w wartości metadanych, to nie zadziała.

użytkownik276695
źródło
8
Proszę wziąć pod uwagę, że „YourEdmxFileName” musi być nazwą kwalifikowaną, np. „YourNamespace.YourEdmxFileName”, jeśli używasz przestrzeni nazw w swoim zestawie. Musisz jednak usunąć część przestrzeni nazw, która jest równa nazwie twojego zestawu.
Marcel
5
MSDN twierdzi, że drugi akapit jest błędny. „Gdy używasz symboli wieloznacznych (*), środowisko Entity Framework musi przeglądać wszystkie zestawy pod kątem zasobów o poprawnej nazwie.”
Craig Stuntz,
Jestem prawie pewien, że przestrzeń nazw nie jest istotna, ale ścieżka osadzonego pliku jest. Więc nawet jeśli przejrzysz plik * .Designer.cs skojarzonego pliku edmx i zauważysz, że przestrzenią nazw klas generowanych automatycznie jest MyCompany ... cokolwiek, nie jest to, czego powinieneś używać. Zamiast tego ścieżka to nazwa zestawu, nazwy folderów rozwiązania / nazwa pliku. Na przykład: „metadane = res: // * / EntityModels. <nazwa_pliku> .csdl |” + "res: // * / EntityModels. <nazwa_pliku> .ssdl |" + "res: // * / EntityModels. <nazwa_pliku> .msl;"
Daniel
1
@Daniel, to w większości poprawne, ale pamiętaj, że przestrzeń nazw i ścieżka do osadzonego pliku są czasami takie same. Aby się upewnić, musisz spojrzeć na Reflector (lub darmową alternatywę).
Craig Stuntz
wygląda na to, że działa tylko przy użyciu nazwy zestawu, bez wersji, publickeytoken itp. Jak:res://MyAssembly/folder.<filename>.csdl...
Ivan Ferrer Villa
67

Miałem podobny błąd. Odtworzyłem projekt (długa historia) i wyciągnąłem wszystko ze starego projektu. Nie zdawałem sobie sprawy, że mój model był wcześniej w katalogu o nazwie „Model”, a teraz w katalogu o nazwie „Modele”. Po zmianie połączenia w moim Web.Config z tego:

<add name="RecipeManagerEntities" connectionString="metadata=res://*/Model.Recipe.csdl 

do tego:

<add name="RecipeManagerEntities" connectionString="metadata=res://*/Models.Recipe.csdl

Wszystko działało (zmieniono Modelna Models). Zauważ, że musiałem zmienić te trzy miejsca w tym ciągu.

Rick Arthur
źródło
2
Przeniosłem model Entity Framework z Modelu do DAL. Ale kiedy napisałem test (tydzień później) w projekcie testowym w celu przetestowania budowniczego predykatów Linq. Mam ten błąd. Poprawiłem testowane projekty App.config, jak wyglądało w web.config głównego projektu - jak powiedziałeś w trzech miejscach. Więc twoja prosta odpowiedź sprawiła, że ​​jestem na dobrej drodze.
Patrik Lindström,
Tak, dziękuję - sprawdź swoje nazwy plików. Jakoś miałem starą nazwę.
PeterX
7
Czy jest jakaś różnica między nimi ?!
Erwin Rooijakkers,
2
@ErwinRooijakkers Model vs ModelS
Marc
Zrozumiałem, że zrobiłem to samo po przeczytaniu bloga Craiga, ale +1 do nauki ważne jest, aby pamiętać, że zmiany wprowadzone w bibliotece klas „podmiotów” nie są wprowadzane automatycznie w plikach konfiguracyjnych projektów, które się do niej odwołują. / westchnienie Cieszę się, że nie jestem sam.
ruffin
26

I szybki sposób na sprawdzenie nazwy modelu bez Reflektora .... poszukaj katalogu

... obj / {config output} / edmxResourcesToEmbed

i sprawdź, czy istnieją pliki zasobów .csdl, .msl i .ssdl. Jeśli znajdują się one w podkatalogu, nazwa podkatalogu musi być poprzedzona nazwą modelu.

Na przykład moje trzy pliki zasobów znajdują się w podkatalogu Data , więc musiałem podać ciąg połączenia

metadane = res: // * / Data .MyModel.csdl | res: // * / Data .MyModel.ssdl | res: // * / Data .MyModel.msl;

(versus metadata = res: //*/MyModel.csdl | res: //*/MyModel.ssdl | res: //*/MyModel.msl;).

leqid
źródło
To był DOKŁADNIE mój problem. Straciłem na tym kilka godzin. Dziękuję bardzo za to łatwe wyjaśnienie
Fernando Carvalhosa
Świetna odpowiedź, właściwie wyjaśnia, jak znaleźć swój ciąg. I pokazuje, że podfoldery mają „.” jako ograniczniki, a nie „\” lub „/”.
cjb110
16

Miałem także ten problem, a to dlatego, że łańcuch połączenia w moim pliku web.config był nieco inny niż w pliku app.config zestawu, w którym znajduje się mój EDMX. Nie mam pojęcia, dlaczego to się zmieniło, ale oto dwie różne wersje.

App.config:

<add name="SCMSEntities" connectionString="metadata=res://*/Model.SMCSModel.csdl|res://*/Model.SMCSModel.ssdl|res://*/Model.SMCSModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=SANDIEGO\sql2008;initial catalog=SCMS;integrated security=True;multipleactiveresultsets=True;application name=EntityFramework&quot;" providerName="System.Data.EntityClient" />

Web.config:

<add name="SCMSEntities" connectionString="metadata=res://*/Model.SCMSModel.csdl|res://*/Model.SCMSModel.ssdl|res://*/Model.SCMSModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=SANDIEGO\sql2008;initial catalog=SCMS;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />

To, co naprawiło, to po prostu kopiowanie ciągu app.config (zauważ niewielką różnicę na końcu - zamiast „ App=EntityFramework„ chciał ” application name=EntityFramework”) do pliku web.config i problem został rozwiązany. :)

Ghlouw
źródło
1
Dzięki, to rzeczywiście był mój problem. Miałem 1 projekt, który uzyskuje dostęp do DB z EF i inny projekt WCF. Po zmianie nazwy pierwszego projektu, connectionString został zmieniony w App.config mojego pierwszego projektu. Musiałem więc zmienić połączenie Connection w projekcie WCF, a także w web.config :)
Volkan
Z dokumentacji MSDN na temat docs.microsoft.com/en-us/dotnet/framework/data/adonet/… : parametry The .NET Framework data provider for SQL Server (SqlClient) supports many keywords from older APIs, but is generally more flexible and accepts synonyms for many of the common connection string keywords.połączenia Entity Framework nie dzielą się tą elastycznością, dlatego należy używać tylko oczekiwanych słów kluczowych.
Suncat2000,
13

Zdarzyło mi się to, gdy przypadkowo zmieniłem działanie kompilacji pliku edmx (pojawia się w obszarze Właściwości w IDE) z „EntityDeploy” na „None”. EntityDeploy jest tym, co wypełnia metadane: patrz http://msdn.microsoft.com/en-us/library/cc982037.aspx

hgcummings
źródło
To była moja poprawka - przemianowałem swój edmx na .old, gdy go skopiowałem i próbowałem kilku rzeczy, a potem, kiedy przemianowałem go z powrotem, Kompilacja Kompilacji ustawiła go na brak i w ten sposób dostał błąd, ustawiając go z powrotem na EntityDeploy rozwiązany mój problem :)
eth0
Przeniesiłem mój plik EDMX do innego folderu i musiałem zmienić akcję kompilacji, aby zaktualizować także nazwy osadzonych zasobów. Dzięki!
David
To było dla mnie rozwiązanie; Zgubiłem to ustawienie podczas aktualizacji do .NET Standard. Dziękuję za uratowanie mi zdrowia psychicznego!
NetherGranite
11

Zdarza mi się to, gdy nie czyszczę rozwiązania przed zbudowaniem nowego projektanta .edmx. Więc nie zapomnij wyczyścić rozwiązania przed zbudowaniem nowego projektanta .edmx. Pomaga mi to pominąć o wiele więcej problemów z tym. Poniżej podane szczegóły nawigacji, jeśli jesteś nowy w studiu wizualnym.

Kliknij-> Kompilacja-> Czyste rozwiązanie

Następnie kliknij-> Kompiluj-> Przebuduj rozwiązanie

Mam nadzieję że to pomoże. Dziękuję wszystkim

Liakat
źródło
8

Właśnie spędziłem z tym szczęśliwe 30 minut. Zmieniłem nazwę obiektu bytu, przemianowałem wpis w pliku konfiguracyjnym, ale jest więcej ... musisz również zmienić odwołanie do csdl

bardzo łatwo przeoczyć - jeśli zmieniasz nazwę, upewnij się, że otrzymałeś wszystko ....

TobyEvans
źródło
6

Miałem ten sam problem. Zajrzałem do mojej zgodnej biblioteki DLL z reflektorem i zobaczyłem, że nazwa zasobu jest nieprawidłowa. Zmieniłem nazwę i teraz wygląda dobrze.

Pitming
źródło
6

W moim przypadku rozwiązuje się to poprzez zmianę właściwości pliku edmx.

  1. Otwórz plik edmx
  2. Kliknij prawym przyciskiem myszy dowolne miejsce projektanta EDMX
  3. wybierz właściwości
  4. zaktualizuj Właściwość o nazwie „Przetwarzanie artefaktu metadanych” na „Osadź w zestawie wyjściowym”

to rozwiązało problem dla mnie. Problem polega na tym, że gdy kontener próbuje znaleźć metadane, nie może go znaleźć. więc po prostu zrób to w tym samym zestawie. to rozwiązanie nie będzie działać, jeśli masz pliki edmx w innym zestawie

użytkownik464507
źródło
+1,000 000 to był dla mnie dzisiaj problem. Problemy z reorganizacją przestrzeni nazw produktów i konsolidacją zespołów.
Mike
6

Spędziłem cały dzień na tym błędzie

jeśli pracujesz n-tear architecture

lub próbowałeś separate Modelswygenerować przez EDMXformularz DataAccessLayer doDomainModelLayer

może dostaniesz ten błąd

  1. Pierwszym krokiem do rozwiązania problemu jest upewnić się, że w ciągu połączenia webconfig (UILayer)i appconfig (DataAccessLayer)są takie same
  2. Drugi co jest bardzo ważny connection string

    connectionString="metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;provid.....

    w czym jest problem

skąd na ziemi mam Model lub cokolwiek .csdl w moim ciągu połączenia, gdzie oni są

oto nasze rozwiązanie patrzę na zdjęcie

wprowadź opis zdjęcia tutaj

mam nadzieję, że ci pomogę

Basheer AL-MOMANI
źródło
5

Udało mi się to rozwiązać w programie Visual Studio 2010, VB.net (ASP.NET) 4.0.

Podczas kreatora modelu encji będzie można zobaczyć parametry połączenia encji. Stamtąd możesz skopiować i wkleić do ciągu połączenia.

Brakowało mi tylko „App_Code”. w ciągu połączeń.

entityBuilder.Metadata = "res://*/App_Code.Model.csdl|res://*/App_Code.Model.ssdl|res://*/App_Code.Model.msl"
Inżynier Internetu
źródło
Niestety ciąg łączący w kreatorze nie jest poprawny dla app.config. @leqid zasugerował dobry sposób na naprawienie ścieżki do modelu.
Der_Meister
5

Po wielu godzinach googlingu i próbach rozwiązania żadne z sugerowanych rozwiązań nie zadziałało. Wymieniłem tutaj kilka rozwiązań. Zauważyłem również ten, który dla mnie pracował. (Używałem EF w wersji 6.1.1 i SQL Server 2014 - ale starszej DB)

  1. Odbuduj projekt i spróbuj ponownie.
  2. Zamknij i otwórz VS - nie wiem, jak to działa
  3. upewnij się, że umieściłeś plik .EDMX w katalogu, upewnij się, że dołączasz katalogi do ConnectionString. na przykład mój jest w folderze DAL. Więc wygląda to tak: connectionString="metadata=res://*/DAL.nameModel.csdl|res://*/DAL.nameModel.ssdl|res://*/DAL.nameModel.msl;(są to pliki. Aby je zobaczyć, możesz przełączyć Pokaż wszystkie pliki w eksploratorze rozwiązań, w katalogu ~ / obj / ..)

... i wiele innych, które próbowałem [jak: przywracanie wersji EntityFramework do późniejszej wersji (nie jestem pewien)]


co dla mnie zadziałało:

z tego artykułu pomógł mi rozwiązać mój problem. Właśnie zmieniłem moje ProviderManifestToken="2012"na ProviderManifestToken="2008"w pliku EDMX. Aby to zrobić:

Solution Explorer

  1. Kliknij plik .edmx prawym przyciskiem myszy
  2. Otwierać z..
  3. Edytor XML
  4. Zmień ProviderManifestToken = „XXXX” w 2008 roku

Mam nadzieję że to pomogło.

ben
źródło
Ostatnio miałem ten problem po dokonaniu pozornie żadnych zmian. Próbowałem zrestartować VS bezskutecznie, ale zostało to naprawione przez czyszczenie i przebudowę. Tak więc dla innych, jeśli nie wprowadziłeś żadnych zmian i nic z tego nie wydaje się odpowiednie, to wypróbuj czystą / odbudowaną próbę.
Greg
5

Jeśli używasz edmx z innego projektu, w parametrze połączenia zmień ...

metadata=res://*/Data.DataModel.csdl

...do...

metadata=res://*/DataModel.csdl
Graham Laight
źródło
To prawda, jeśli chcesz przenieść go do nowego podfolderu projektu, musisz dodać folder.subfolderprzed nim.
qakmak
Dzięki, to rozwiązanie działało dla mnie. Przeniosłem mój plik .edmx z katalogu w jednym projekcie do katalogu głównego innego projektu i musiałem usunąć nazwę katalogu z wszystkich ciągów połączeń w moim rozwiązaniu.
Chris,
4

Ostatecznym rozwiązaniem (nawet po odtworzeniu bazy danych na dwóch innych komputerach, a także EDMX i innych dodatkach) było nieużywanie pierwszej edycji Entity Framework. Nie możemy się doczekać ponownej oceny w .NET 4.0.

Po ponownym napotkaniu tego samego problemu i szukaniu odpowiedzi w końcu znalazłem kogoś, kto miał ten sam problem. Wygląda na to, że parametry połączenia nie zostały poprawnie wygenerowane przez kreatora Visual Studio, a łącze do zasobów metadanych nie zawierało ważnej ścieżki.

BŁĄD v1.0 ?: Nie można załadować określonego zasobu metadanych. Skrypty! = Modele

Aktualizacja 16.01.2013 : Po przejściu na prawie wyłącznie stosowanie pierwszych praktyk kodu EF (nawet w przypadku istniejących baz danych) problem ten nie jest już problemem. Dla mnie było to realne rozwiązanie, aby zmniejszyć bałagan z automatycznie generowanego kodu i konfiguracji oraz zwiększyć własną kontrolę nad produktem.

J. Steen
źródło
4

Mój problem i rozwiązanie, objawy były takie same „Nie można załadować określonego zasobu metadanych”, ale podstawowa przyczyna była inna. Miałem 2 projekty w rozwiązaniu, jednym był EntityModel, a drugim rozwiązaniem. Właściwie usunąłem i ponownie utworzyłem plik EDMX w EntityModel.

Rozwiązaniem było to, że musiałem wrócić do projektu aplikacji sieci Web i dodać tę linię do pliku konfiguracyjnego. Nowy model zmienił kilka elementów, które musiały zostać zduplikowane w pliku Web.Config „innego” projektu. Stara konfiguracja nie była już dobra.

     <add name="MyEntities"
     connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;
                    provider=System.Data.SqlClient;
                    provider connection string=&quot;
                    data source=Q\DEV15;initial catalog=whatever;
                    user id=myuserid;password=mypassword;
                    multipleactiveresultsets=True;
                    application name=EntityFramework&quot;"
     providerName="System.Data.EntityClient" />
John Peters
źródło
4

Czasami widzę ten błąd w moim projekcie. Rozwiązuję to przez

1 - Kliknij prawym przyciskiem myszy plik EDMX

2 - Wybierz Run Custom Toolopcję

3 - Przebuduj projekt

MOH3N
źródło
To zadziałało dla mnie, ale później musiałem też odbudować
rdans
3

W moim przypadku ten problem dotyczył zmiany nazwy pliku edmx mojego modelu ... poprawienie ciągu połączenia app.config dla plików csdl / ssdl / msl naprawiło mój problem.

Jeśli używasz projektanta EF 4.0 do generowania csdl / ssdl / msl, te 3 „pliki” będą faktycznie przechowywane w głównym pliku edmx modelu. W tym przypadku post Waqasa jest prawie na znaku. Ważne jest, aby zrozumieć, że „Model_Name” w jego przykładzie będzie musiał zostać zmieniony na dowolną bieżącą nazwę pliku .edmx twojego modelu (bez .edmx).

Ponadto, jeśli Twój plik edmx nie znajduje się na poziomie głównym projektu, musisz poprzedzić Model_Name o ścieżce względnej, np.

res://*/MyModel.WidgetModel.csdl|res://*/MyModel.WidgetModel.ssdl|res://*/MyModel.WidgetModel.msl

określa csdl / ssdl / msl xml jest przechowywany w pliku modelu „WidgetModel.edmx”, który jest przechowywany w folderze o nazwie „MyModel”.

Janmon
źródło
3

Napisałem tę klasę pomocnika, aby utworzyć instancje obiektów ObjectContext, gdy są one zdefiniowane w innym projekcie niż projekt, który go używa. Analizuję parametry połączenia w pliku konfiguracyjnym i zastępuję „*” pełną nazwą zestawu.

Nie jest idealny, ponieważ wykorzystuje odbicie do budowy obiektu, ale jest to najbardziej ogólny sposób na zrobienie tego, jaki mogłem znaleźć.

Mam nadzieję, że to komuś pomoże.

public static class EntityHelper<T> where T : ObjectContext
{
    public static T CreateInstance()
    {
        // get the connection string from config file
        string connectionString = ConfigurationManager.ConnectionStrings[typeof(T).Name].ConnectionString;

        // parse the connection string
        var csBuilder = new EntityConnectionStringBuilder(connectionString);

        // replace * by the full name of the containing assembly
        csBuilder.Metadata = csBuilder.Metadata.Replace(
            "res://*/",
            string.Format("res://{0}/", typeof(T).Assembly.FullName));

        // return the object
        return Activator.CreateInstance(typeof(T), csBuilder.ToString()) as T;
    }
}
lau
źródło
3

Dla Was wszystkich SelftrackingEntities użytkowników, jeśli postępowaliście zgodnie z instrukcją Microsoft i oddzieliliście klasę kontekstową Object do projektu usługi wcf (łącząc się z kontekstowym .tt), więc ta odpowiedź jest dla was:

część odpowiedzi pokazanych w tym poście, która zawiera kod taki jak:

... = string.Format("res://{0}/YourEdmxFileName.csdl|res://{0}/YourEdmxFileName.ssdl|res://{0}/YourEdmxFileName.msl", 
        typeof(YourObjectContextType).Assembly.FullName); 

NIE DZIAŁA DLA CIEBIE !! powodem jest to, że YourObjectContextType.Assemblyteraz znajduje się w innym zespole (wewnątrz zespołu projektu wcf),

Więc powinieneś zastąpić YourObjectContextType.Assembly.FullName ->

ClassTypeThatResidesInEdmProject.Assembly.FullName 

baw się dobrze.

Robocide
źródło
2

Miałem problemy z tym samym komunikatem o błędzie. Mój problem został rozwiązany przez zamknięcie i ponowne otwarcie programu Visual Studio 2010.

Adam
źródło
2

Miałem ten sam problem, ponieważ zmieniłem nazwę zestawu.

Musiałem także zmienić nazwę w atrybutach AssemblyTitle i AssemblyProduct w właściwościach projektu / AssemblyInfo.cs, a także usunąć i ponownie dodać odwołanie do pliku edmx.

Potem działało dobrze.

Antoine Meltzheim
źródło
2

Mając ten sam problem, odtworzyłem edmx z bazy danych. Rozwiązuje mój problem.

صفي
źródło
2
Niestety rozwiązuje to problem, a nie przyczynę.
Clarice Bouwer
2

Wyjątkiem jest to, że kompilator wskazuje na nieistniejące metadane, więc po prostu skopiuj parametry app.config połączenia do Web.configConnectionString

Krishna shidnekoppa
źródło
1

Miałem również ten sam problem i rozwiązanie jak w przypadku Ricka, tyle że importowałem istniejący plik .edmx do nowego projektu i chociaż podstawowa przestrzeń nazw nie miała znaczenia, została zaimportowana do innego podkatalogu, więc musiałem również zaktualizować połączenie string wewnątrz Web.Config w trzech miejscach, aby uwzględnić różne nazewnictwo podkatalogów:

eagle779
źródło
1

Miałem ten sam problem z rozwiązaniem, które zawierało projekty w folderze rozwiązań, gdy zostały one przeniesione do katalogu głównego rozwiązania (w celu przezwyciężenia podejrzenia błędu w Mvc3AppConverter z powodu lokalizacji projektów).

Chociaż rozwiązanie skompilowane po tym, jak wszystkie * referencje do projektu zostały ponownie dodane w razie potrzeby, błąd został zgłoszony podczas uruchamiania witryny.

EDMX znajduje się w jednym z przeniesionych projektów (projekt „Data”), ale oczywiście brak odniesienia do projektu Data nie spowodował błędu kompilacji, tylko błąd w czasie wykonywania.

Po prostu dodanie brakującego odniesienia do projektu podstawowego rozwiązało ten problem, nie trzeba w ogóle edytować połączenia.

Mam nadzieję, że to pomaga komuś innemu.

Chris
źródło
1

Co do mnie, oddzieliłem warstwę dostępu do danych i warstwę interfejsu użytkownika. Mam więc ciąg połączenia encji dla każdej warstwy.

Zanim zmodyfikuję te dwa oddzielne ciągi połączeń, aby były takie same, nadal stwierdziłem, że poniżej błędu.

Unable to load the specified metadata resource

Robię więc te same ciągi połączeń dla tych dwóch warstw (DAL, UI), działa idealnie.

Moje rozwiązanie polega na tym, aby wszystkie parametry połączenia były takie same bez względu na to, gdzie zostały już przedstawione .

Frank Myat Thu
źródło
1

Miałem ten problem wczoraj i patrzyłem na mój kod podczas debugowania i dane wyjściowe z SQL Profiler.

Przed przeczytaniem i zrozumieniem tego postu nie mogłem zrozumieć, dlaczego EntityFramework zgłosił ten błąd, wywołując DB. Przeglądałem setki wierszy w programie SQL Profiler, próbując ustalić, co było nie tak z modelem bazy danych. Nie mogłem znaleźć czegoś takiego jak oczekiwany telefon i, szczerze mówiąc, nie byłem pewien, czego szukam.

Jeśli jesteś w tej pozycji, sprawdź parametry połączenia. Domyślam się, że zanim EntityFramework utworzy swój SQL, sprawdzi model określony w części metadanych ciągu połączenia. W moim przypadku było źle. EntityFramework nie dotarł nawet do DB.

Upewnij się, że nazwy są poprawne. Kiedy już to rozwiązałem, zobaczyłem wywołania w SQL Profiler, gdzie ApplicationName to „EntityFramework” z SQL wywołującym oczekiwane tabele.

Daniel Hollinrake
źródło
1

Może to zrobić słaby plik app.config lub web.config. Skopiowałem ciąg połączenia app.config do mojego web.config w moim interfejsie użytkownika i skończyłem wpisując:

<connectionStrings>
    <connectionStrings>
          <add name="name" connectionString="normalDetails"/>
    </connectionStrings>
</connectionStrings>
MyDaftQuestions
źródło