Сбой ExecuteStoreQuery Entity Framework в развернутых системах

#c# #sql-server-2008 #entity-framework #executestorequery

#c# #sql-server-2008 #entity-framework #executestorequery

Вопрос:

Хорошо, здесь я немного в тупике, и вместо того, чтобы больше ломать голову над этим, я подумал, что расскажу об этом всем здесь способным людям.

Я использую Entity Framework и c # для решения WinApp, и суть проблемы заключается в том, что проклятая штука отлично работает в моей системе, но после того, как я ее разверну, она выходит из строя. Даже когда я устанавливаю развернутое приложение в свою систему разработки, оно завершается сбоем. Я нахожу это немного тревожным.

Перейдем к сути проблемы. Пользователь выполняет поиск, я создаю запрос, подключаюсь к SQL с помощью вызова ExecuteStoreQuery и возвращаю общий список объектов SearchResult.

Вызов:

 retVal = ctx.ExecuteStoreQuery<SearchResults>(sql).ToList();
  

Альтернативный вызов также генерирует ту же ошибку:

 ObjectQuery<DbDataRecord> c = ctx.CreateQuery<DbDataRecord>(sql);
  

Ошибка:

 ************** Exception Text **************
System.Reflection.ReflectionTypeLoadException: Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.
   at System.Reflection.RuntimeModule.GetTypes(RuntimeModule module)
   at System.Reflection.RuntimeModule.GetTypes()
   at System.Reflection.Assembly.GetTypes()
   at System.Data.Metadata.Edm.ObjectItemConventionAssemblyLoader.LoadTypesFromAssembly()
   at System.Data.Metadata.Edm.ObjectItemAssemblyLoader.Load()
   at System.Data.Metadata.Edm.AssemblyCache.LoadAssembly(Assembly assembly, Boolean loadReferencedAssemblies, ObjectItemLoadingSessionData loadingData)
   at System.Data.Metadata.Edm.AssemblyCache.LoadAssembly(Assembly assembly, Boolean loadReferencedAssemblies, ObjectItemLoadingSessionData loadingData)
   at System.Data.Metadata.Edm.AssemblyCache.LoadAssembly(Assembly assembly, Boolean loadReferencedAssemblies, ObjectItemLoadingSessionData loadingData)
   at System.Data.Metadata.Edm.AssemblyCache.LoadAssembly(Assembly assembly, Boolean loadReferencedAssemblies, ObjectItemLoadingSessionData loadingData)
   at System.Data.Metadata.Edm.AssemblyCache.LoadAssembly(Assembly assembly, Boolean loadReferencedAssemblies, KnownAssembliesSet knownAssemblies, EdmItemCollection edmItemCollection, Action`1 logLoadMessage, Objectamp; loaderCookie, Dictionary`2amp; typesInLoading, List`1amp; errors)
   at System.Data.Metadata.Edm.ObjectItemCollection.LoadAssemblyFromCache(ObjectItemCollection objectItemCollection, Assembly assembly, Boolean loadReferencedAssemblies, EdmItemCollection edmItemCollection, Action`1 logLoadMessage)
   at System.Data.Metadata.Edm.MetadataWorkspace.ImplicitLoadAssemblyForType(Type type, Assembly callingAssembly)
   at System.Data.Objects.ObjectContext.ExecuteStoreQueryInternal[TElement](String commandText, String entitySetName, MergeOption mergeOption, Object[] parameters)
   at AMMCred.Data.Search.GetSearchResults(SearchTerms terms)
   at AMMCred.frmMain.openProviderInfoToolStripMenuItem_Click(Object sender, EventArgs e)
   at System.Windows.Forms.ToolStripItem.RaiseEvent(Object key, EventArgs e)
   at System.Windows.Forms.ToolStripMenuItem.OnClick(EventArgs e)
   at System.Windows.Forms.ToolStripItem.HandleClick(EventArgs e)
   at System.Windows.Forms.ToolStripItem.HandleMouseUp(MouseEventArgs e)
   at System.Windows.Forms.ToolStripItem.FireEventInteractive(EventArgs e, ToolStripItemEventType met)
   at System.Windows.Forms.ToolStripItem.FireEvent(EventArgs e, ToolStripItemEventType met)
   at System.Windows.Forms.ToolStrip.OnMouseUp(MouseEventArgs mea)
   at System.Windows.Forms.ToolStripDropDown.OnMouseUp(MouseEventArgs mea)
   at System.Windows.Forms.Control.WmMouseUp(Messageamp; m, MouseButtons button, Int32 clicks)
   at System.Windows.Forms.Control.WndProc(Messageamp; m)
   at System.Windows.Forms.ScrollableControl.WndProc(Messageamp; m)
   at System.Windows.Forms.ToolStrip.WndProc(Messageamp; m)
   at System.Windows.Forms.ToolStripDropDown.WndProc(Messageamp; m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Messageamp; m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Messageamp; m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
  

SearchResults — это пользовательский объект, вот так:

 public class SearchResults : IEquatable<SearchResults>
{
    private Guid id = Guid.Empty;
    public Guid PROV_MPI_NO
    {
        get { return id; }
        set { id = value; }
    }
    private string iPA = "";
    public string IPA
    {
        get { return iPA; }
        set { iPA = value; }
    }
    private string firstName = "";
    public string FirstName
    {
        get { return firstName; }
        set { firstName = value; }
    }
    private string middleName = "";
    public string MI
    {
        get { return middleName; }
        set { middleName = value; }
    }
    private string lastName = "";
    public string LastName
    {
        get { return lastName; }
        set { lastName = value; }
    }
    private string license = "";
    public string License
    {
        get { return license; }
        set { license = value; }
    }
    private string provId = "";
    public string ProvId
    {
        get { return provId; }
        set { provId = value; }
    }
    /// <summary>
    /// Used to help identify duplicates in a collection
    /// </summary>
    /// <param name="other"></param>
    /// <returns></returns>
    public bool Equals(SearchResults other)
    {
        return (this.PROV_MPI_NO == other.PROV_MPI_NO amp;amp; this.License == other.License);
    }
}
  

И, наконец, вот часть SQL select, используемая для получения результатов поиска:

 SELECT a.PROV_MPI_NO, b.COMPANY_ID AS IPA, a.FIRSTNAME,a.MI,a.LASTNAME, b.PROVID, c.LICENSE
  

Проблема, похоже, исходит из Entity Framework, поскольку она привязывает результаты SQL к пользовательскому объекту. Я проверил, что имена полей пользовательского объекта совпадают с именами полей SQL на случай, если это имело значение, чего, похоже, не было.

Мне чертовски скоро пора уходить, и я буду обдумывать это все выходные, поэтому я, вероятно, буду время от времени заходить, чтобы ответить на любые вопросы, которые у кого-либо могут возникнуть.

Как я уже сказал, на данный момент я в полном замешательстве и был бы очень признателен за чье-либо понимание.

Заранее спасибо!

Уэйн

ОБНОВИТЬ 11/14/2011———- Запустил средство просмотра журнала привязки сборки и выдал следующее руководство. Похоже на Microsoft.Практика.Unity не загружается. Дело в том, что я ни разу не ссылался на эти практические сборки ни в одном приложении, но, похоже, System.Data.Entity делает … поди разберись. Это зацепка … любая информация об этой новой разработке очень ценится.

 *** Assembly Binder Log Entry  (11/14/2011 @ 3:10:52 PM) ***

The operation failed.
Bind result: hr = 0x80070002. The system cannot find the file specified.

Assembly manager loaded from:  C:WindowsMicrosoft.NETFrameworkv4.0.30319clr.dll
Running under executable  C:Users***me***AppDataLocalApps2.01ND1AZ7G.HEJCWDQKK8A.LVOammc..tion_0000000000000000_0002.0000_456d6de62e1c40e4AMMCred2.exe
--- A detailed error log follows. 

=== Pre-bind state information ===
LOG: User = ***me***
LOG: DisplayName = Microsoft.Practices.Unity, Version=1.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
 (Fully-specified)
LOG: Appbase = file:///C:/Users/***me***/AppData/Local/Apps/2.0/1ND1AZ7G.HEJ/CWDQKK8A.LVO/ammc..tion_0000000000000000_0002.0000_456d6de62e1c40e4/
LOG: Initial PrivatePath = NULL
LOG: Dynamic Base = NULL
LOG: Cache Base = NULL
LOG: AppName = AMMCred2.exe
Calling assembly : Microsoft.Practices.EnterpriseLibrary.Common, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: C:Users***me***AppDataLocalApps2.01ND1AZ7G.HEJCWDQKK8A.LVOammc..tion_0000000000000000_0002.0000_456d6de62e1c40e4AMMCred2.exe.config
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:WindowsMicrosoft.NETFrameworkv4.0.30319configmachine.config.
LOG: Post-policy reference: Microsoft.Practices.Unity, Version=1.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
LOG: GAC Lookup was unsuccessful.
LOG: Attempting download of new URL file:///C:/Users/***me***/AppData/Local/Apps/2.0/1ND1AZ7G.HEJ/CWDQKK8A.LVO/ammc..tion_0000000000000000_0002.0000_456d6de62e1c40e4/Microsoft.Practices.Unity.DLL.
LOG: Attempting download of new URL file:///C:/Users/***me***/AppData/Local/Apps/2.0/1ND1AZ7G.HEJ/CWDQKK8A.LVO/ammc..tion_0000000000000000_0002.0000_456d6de62e1c40e4/Microsoft.Practices.Unity/Microsoft.Practices.Unity.DLL.
LOG: Attempting download of new URL file:///C:/Users/***me***/AppData/Local/Apps/2.0/1ND1AZ7G.HEJ/CWDQKK8A.LVO/ammc..tion_0000000000000000_0002.0000_456d6de62e1c40e4/Microsoft.Practices.Unity.EXE.
LOG: Attempting download of new URL file:///C:/Users/***me***/AppData/Local/Apps/2.0/1ND1AZ7G.HEJ/CWDQKK8A.LVO/ammc..tion_0000000000000000_0002.0000_456d6de62e1c40e4/Microsoft.Practices.Unity/Microsoft.Practices.Unity.EXE.
LOG: All probing URLs attempted and failed.
  

Комментарии:

1. Я бы посоветовал включить ведение журнала fusion, если оно у вас еще не включено. Конкретная сборка, которую он ищет, должна отображаться в файле журнала, и это может помочь выяснить, что происходит.

2. Я даже не знал, что что-то подобное существует. Запустил его следующим образом: msdn.microsoft.com/en-us/library/e74a18c4(v=VS.100).aspx — и результат оказался пустым. Ничего не произошло. Возможно, я сделал что-то неправильно, возможно, это не работает с развернутым WinApp? Не уверен. Мысли или идеи?

3. Вам нужно будет включить ведение журнала в системе с проблемой, чтобы получить значимые ошибки. На самом деле я видел несколько случаев, когда ведение журнала fusion не помогает; в этом случае вам нужно обновить обработку исключений, чтобы извлечь LoaderExceptions. Вы также можете проверить, чтобы убедиться, что на компьютере конечного пользователя установлен правильный . Установлен Net framework.

4. Я понял это, пришлось указать путь в приложении для записи файлов журнала, иначе вы ничего не получите… там ошибка новичка. 🙂 Теперь получил больше информации … хочу разместить ее.

Ответ №1:

Ошибка является исключением при загрузке.

Поскольку это работает в процессе разработки, но не в развернутой программе, вероятно, это связано с тем, что dll не включена.

Зайдите в свой проект VS, разверните ссылки и проверьте свойства каждой библиотеки DLL, убедитесь, что copy local = true для библиотек DLL, которые не развертываются.

Комментарии:

1. Хороший вызов, проверил ссылки, там все в порядке. Моя сборка entity уже помечена как Copy Local = True. Я сравнил с другим решением, которое также работает нормально. Похоже, проблема не в этом. Большое спасибо за ответ! Все еще ищу.

Ответ №2:

Судя по вашему результату привязки, похоже, что вы не развертываете Microsoft.Практика.Единство.DLL с вашим приложением. И похоже, что на это ссылается Microsoft.Практика.Корпоративная библиотека.Распространено, поэтому у вас нет прямой ссылки.

Вот статья MSDN, в которой описываются различные зависимости, имеющиеся в корпоративной библиотеке.

Обновить

Я только что проверил прямые зависимости System.Data.Entity, используя ildasm.exe (C:Program Files (x86) Microsoft SDKs Windows v7.0A Bin) и это определенно не ссылается на корпоративную библиотеку. Я был бы крайне удивлен, если бы это произошло, потому что они обычно не создают зависимостей между системными библиотеками DLL и дополнительными библиотеками DLL продукта (только по этой причине).

Используете ли вы другие библиотеки DLL / ссылки, которые могут включать это? Если вы не уверены, вы можете использовать ildasm.exe перейдите к DLL, затем откройте ее манифест. Это немного сложно читать, но вы ищете ссылки, такие как:

 module extern 'System.Data.dll, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
  

и

 .assembly extern System.Data
  

Комментарии:

1. Ну, в том-то и дело, что я его не включаю, похоже, System.Data.Entity …. Значит ли это, что я должен найти эту сборку и установить ее? Ни в одном из разработанных мной приложений у меня не установлено ничего из практических материалов… Я бы назвал это ошибкой Entity Framework.

2. Возможно, у вас в конечном итоге была какая-то конфигурация в вашем файле app.config, которая может ссылаться на них?

3. Хм … SubSonic, который я пытаюсь заменить, содержит ссылку на практику… Вызов явно является вызовом сущности, и у меня всегда был дозвуковой запуск… Фактически он заменяется, но я пока не могу выполнить замену на 100%… Хорошо, я собираюсь обдумать это overnight…my мозг поджарен. Мне нужен банан…

4. Похоже, что взаимодействие с Entity Framework и SubSonic вызывает проблему. SubSonic использует шаблоны, включая Unity. Я включил Microsoft. Практика. Библиотека dll Unity в моем приложении, и все работает нормально. Получите это здесь: microsoft.com/download/en/… Теперь осталось получить некоторое время, чтобы полностью удалить SubSonic и попробовать это снова. Когда я это сделаю, я обновлю этот пункт с более подробной информацией. На данный момент, похоже, это работает. Спасибо competent_tech за помощь! Вы показали мне несколько новых вещей, с которыми мне никогда не приходилось сталкиваться. Спасибо!!!