【问题标题】:Entity Framework ExecuteStoreQuery fails on deployed systems实体框架 ExecuteStoreQuery 在已部署的系统上失败
【发布时间】:2011-11-12 00:32:46
【问题描述】:

好吧,这里有点难住了,我不想再为此烦恼,我想我会把它扔给这里所有聪明的人。

我正在使用 Entity Framework 和 c# 作为 WinApp 解决方案,问题的核心是该死的东西在我的系统上运行良好,但在我部署它之后,它失败了。即使我在我的开发系统上安装部署的应用程序,它也会失败。我觉得这有点令人不安。

对于这个问题的疯狂和大胆。用户执行搜索,我构建查询,通过 ExecuteStoreQuery 调用点击 SQL 并返回 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 部分:

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

问题似乎来自实体框架,因为它将 SQL 的结果绑定到自定义对象。我已经验证了自定义对象字段名称与 SQL 字段相同,以防万一,但它似乎并不重要。

离我离开的时间太近了,我整个周末都在思考这个问题,所以我可能会不时回来回答任何人可能有的问题。

就像我说的那样,我现在完全被难住了,非常感谢任何人的洞察力。

提前致谢!

韦恩

2011 年 11 月 14 日更新---------- 运行程序集绑定日志查看器工具并提出以下线索。看起来 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.

【问题讨论】:

  • 如果您还没有打开融合日志记录,我建议您打开它。它正在寻找的特定程序集应该显示在日志文件中,这可能有助于弄清楚发生了什么。
  • 我什至不知道有这样的东西存在。在此之后试一试:msdn.microsoft.com/en-us/library/e74a18c4%28v=VS.100%29.aspx - 空空如也。没啥事儿。也许我做错了什么,也许它不适用于已部署的 WinApp?没有把握。想法或想法?
  • 您需要在有问题的系统上打开日志记录才能获得有意义的错误。我实际上已经看到了一些融合记录没有帮助的情况。在这种情况下,您需要更新异常处理以提取 LoaderExceptions。您还可以检查以确保最终用户的计算机安装了正确的 .Net 框架。
  • 我想通了,必须在应用程序中放置一个路径才能写入日志文件,否则你什么也得不到……lol noob 错误。 :) 现在得到了更多信息......正在寻找放置它。

标签: c# sql-server-2008 entity-framework executestorequery


【解决方案1】:

错误是加载异常。

由于这在开发中有效,但在部署的程序中无效,可能是由于未包含 dll。

进入您的 VS 项目,展开引用并检查每个 dll 的属性,确保未部署的 dll 的 copy local = true。

【讨论】:

  • 好电话,检查了参考资料,但一切都很好。我的实体程序集已标记为 Copy Local=True。我比较了另一个运行良好的解决方案。这似乎不是问题。非常感谢您的回复!不过还在寻找。
【解决方案2】:

根据您的绑定结果,您似乎没有在应用程序中部署 Microsoft.Practices.Unity.DLL。看起来这是从 Microsoft.Practices.EnterpriseLibrary.Common 引用的,这就是您没有直接引用的原因。

Here is the MSDN article 描述了企业库所具有的各种依赖关系。

更新

我刚刚使用 ildasm.exe (C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin) 检查了 System.Data.Entity 的直接依赖关系,它绝对没有引用企业库。如果有的话我会非常惊讶,因为它们通常不会在系统 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

【讨论】:

  • 嗯,就是这样,我不包括它,System.Data.Entity 似乎是....所以这是否意味着我必须去寻找这个程序集并安装它?我没有在我开发的任何应用程序中安装任何实践的东西......我称之为实体框架错误。
  • 您是否最终在 app.config 文件中得到了一些可能引用这些的配置?
  • 嗯...SubSonic,我试图替换它有对实践的引用...这个调用显然是一个实体调用,我让 SubSonic 永远运行......它正在事实上更换了,但我还不能做到 100% 更换......好吧,我要在晚上咀嚼这个......我的大脑被炸了。我需要一根香蕉……
  • 似乎与 Entity Framework 和 SubSonic 的交互导致了问题。 SubSonic 正在使用 Patterns 的东西,包括 Unity。我在我的应用程序中包含了 Microsoft.Practices.Unity dll,一切正常。在这里获取它:microsoft.com/download/en/… 现在剩下的就是花一些时间完全删除 SubSonic 并重试。当我这样做时,我会用更多细节更新这个项目。目前,它似乎正在发挥作用。感谢您的帮助!你向我展示了一些我从未接触过的新事物。谢谢!!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-02
  • 2014-01-30
  • 2015-03-19
  • 2014-04-03
  • 1970-01-01
  • 2014-04-17
  • 2011-08-24
相关资源
最近更新 更多