Entity Framework ExecuteStoreQuery не работает в развернутых системах - PullRequest
1 голос
/ 12 ноября 2011

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

Я использую 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, Object& loaderCookie, Dictionary`2& typesInLoading, List`1& 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(Message& m, MouseButtons button, Int32 clicks)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
   at System.Windows.Forms.ToolStrip.WndProc(Message& m)
   at System.Windows.Forms.ToolStripDropDown.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& 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 && this.License == other.License);
    }
}

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

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

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

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

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

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

Wayne

ОБНОВЛЕНИЕ 14/14/2011 ---------- Запустил инструмент просмотра журнала привязки сборки и предложил следующее руководство. Похоже, Microsoft.Practices.Unity не загружается. Дело в том, что я никогда ни разу не ссылался на эти сборки Practices в ЛЮБОМ приложении, но кажется, что 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:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll
Running under executable  C:\Users\***me***\AppData\Local\Apps\2.0\1ND1AZ7G.HEJ\CWDQKK8A.LVO\ammc..tion_0000000000000000_0002.0000_456d6de62e1c40e4\AMMCred2.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***\AppData\Local\Apps\2.0\1ND1AZ7G.HEJ\CWDQKK8A.LVO\ammc..tion_0000000000000000_0002.0000_456d6de62e1c40e4\AMMCred2.exe.config
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.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.

Ответы [ 2 ]

1 голос
/ 14 ноября 2011

Ошибка - исключение загрузки.

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

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

0 голосов
/ 15 ноября 2011

Судя по вашему результату связывания, вы не развертываете Microsoft.Practices.Unity.DLL с вашим приложением.И похоже, что на него ссылаются из Microsoft.Practices.EnterpriseLibrary.Common, поэтому у вас нет прямой ссылки.

Вот статья 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...