【问题标题】:ADO.NET Entity Connection String for Multiple Projects多个项目的 ADO.NET 实体连接字符串
【发布时间】:2010-11-09 22:42:29
【问题描述】:

我正在使用多层项目,其中 DataModel 托管 ADo.NET 实体模型,DataAccess 层进行验证。

但是每次我遇到这样的错误

在配置中找不到指定的命名连接,不打算与 EntityClient 提供程序一起使用,或者无效。

我试过连接字符串

<add name="SalesEntities" connectionString="metadata=res://*/SalesEntities.csdl|res://*/SalesEntities.ssdl|res://*/SalesEntities.msl;provider=System.Data.SqlClient;provider connection string="Data Source=.;Initial Catalog=Phoenix;Integrated Security=True;MultipleActiveResultSets=True"" providerName="System.Data.EntityClient" />

<add name="SalesEntities" connectionString="metadata=.\SalesEntities.csdl|.\SalesEntities.ssdl|.\SalesEntities.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=.;Initial Catalog=Phoenix;Integrated Security=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />

还尝试了其他组合来引用被调用项目目录的根目录,但没有运气。

非常感谢任何帮助。非常感谢一如既往:)。

【问题讨论】:

    标签: entity-framework ado.net linq-to-entities ado.net-entity-data-model


    【解决方案1】:

    您必须将这些连接字符串放在每个应用程序的 app.config 文件中。如果你有一个生成模型的 DAL,然后尝试在 EXE 中使用 DAL,同样的事情也会发生。 EXE 不知道连接字符串。

    我发现最简单的方法是在每个项目上放置一个 app.config,然后从我最初生成模型的 DAL 中复制连接字符串。然后每个人都会有一个相同的连接字符串的副本。

    【讨论】:

    • hm,是否有可能将所有连接字符串存储在一个地方,然后“告诉”所有 web.config 文件在哪里可以找到该连接字符串?
    • 您可以将它们放在 MACHINE.CONFIG(机器上的全局)中,但这需要更多的权限,并且在这种情况下部署不是一个好主意。
    • 使用分部类,您可以为实体生成的数据上下文创建自己的构造函数,并让它们根据需要设置连接字符串。您还必须在实例化数据上下文时调用该特定构造函数。
    【解决方案2】:

    如果您将 App.Config 文件复制到主项目中,并将所有 &amp;quot; 替换为正常的 ' 字符,它应该运行

    【讨论】:

      【解决方案3】:

      我建议对上面给出的建议稍作改动。

      这不是一个巨大的改进,但至少它给了你一些关注点分离。

      当 EF 向导创建 .edmx 文件及其关联的 .Designer.cs 文件时,C# 代码会声明一个分部类。因此,您可以简单地将另一个.cs 文件添加到包含两个 EDM 文件的项目中。

      这个新文件为相同的命名空间和类定义了一个额外的静态函数。

      这个新的静态函数将返回所需类型的实例(ObjectContext 的后代)。

      新文件是一个单独的文件,因此如果您重新创建 .edmx 和 .Designer.cs,它不会被覆盖。

      您从 EDM 项目的 .config 中复制并粘贴连接字符串,这是一种 hack,但至少它使连接字符串隐藏在 EDM 项目中。

      新文件如下所示:

      namespace MyNamespace
      {
        public partial class MyEntities : ObjectContext
        {
          public static MyEntities New_MyEntities()
          {
            string connStr;
            MyEntities theContext;
      
            connStr = "metadata=res://*/MyClass.csdl|res://*/MyClass.ssdl|res://*/MyClass.msl;provider=System.Data.SqlClient;provider connection string=\"Data Source=localhost\\SQLSERVER;Initial Catalog=MyDb;Integrated Security=True;MultipleActiveResultSets=True\"";
            // set the connection string
      
            theContext = new MyEntities(connStr);
            // allocate it
      
            return theContext;
            // return it
          }
        }
      }
      

      要获取新实体对象,您只需从调用项目中调用静态函数 New_MyEntities()。

      【讨论】:

        【解决方案4】:

        我将 entityconnectionstring 传递给 objectContext 类的所有实例,它现在正在工作。

        但是它的开销太大了,用连接字符串创建一个属性并将其作为参数传递给每个实例

        【讨论】:

          【解决方案5】:

          我添加了同样的问题,试图对我的 DAL 进行单元测试。我发现这行得通:

          <add name="SalesEntities" connectionString="metadata=res://*;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=.;Initial Catalog=Phoenix;Integrated Security=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" /> 
          

          【讨论】:

            【解决方案6】:

            我在 WinForms 项目中遇到了类似的问题,尽管尝试了我在网络上找到的与它相关的所有内容,但无法解决我的问题.....直到我删除了我用于 ObjectContext 的字段(私有 CubEntities _oc = new CubEntities()) 从我的 BaseForm 到使用它的实际表单。

            【讨论】:

              【解决方案7】:

              我遇到了同样的问题,我尝试了所有提到的方法。最后我如前所述解决了它。就我而言,我有单独的数据层和表示层。在我的app.config(数据层)中,我有这样的连接。

               <add name="LibraryMgtSysEntities" connectionString="metadata=res://*/DataLibraryMgtSys.csdl|res://*/DataLibraryMgtSys.ssdl|res://*/DataLibraryMgtSys.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=abc;initial catalog=LibraryMgtSys;Persist Security Info=True;user id=sa;password=123;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />
              

              在我的web.config我手动配置连接如下:

              <add name="DefaultConnection" providerName="System.Data.SqlClient"
               connectionString="Data Source=abc;
               Initial Catalog=LibraryMgtSys;
               Integrated Security=SSPI;
               user id=sa;password=123;" />
              

              它给了我与上面提到的相同的例外。所以我通过在 web 配置文件中添加 app.config 值来解决它。

              我的最终web.config文件如下:

              <connectionStrings>
                  <clear />
                  <add name="LibraryMgtSysEntities" connectionString="metadata=res://*/DataLibraryMgtSys.csdl|res://*/DataLibraryMgtSys.ssdl|res://*/DataLibraryMgtSys.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=TILANITHOTAMUNE\SQLEXPRESS;initial catalog=LibraryMgtSys;Persist Security Info=True;user id=sa;password=testing;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />
                  <add name="DefaultConnection" providerName="System.Data.SqlClient"
                       connectionString="Data Source=abc;
                       Initial Catalog=LibraryMgtSys;
                       Integrated Security=SSPI;
                       user id=sa;password=123;" />
                </connectionStrings>
              

              【讨论】:

                【解决方案8】:

                我在我的一个项目中遇到了问题,因为作业、Web 应用程序和测试项目需要实体框架连接字符串。处理此问题的一种方法如下:

                1) 使用 UnitOfWork(或类似的)模式。这允许控制数据上下文的创建和操作连接字符串

                public partial class MyContext
                {
                    #region Members
                    private static readonly object objSync = new object();
                    private static readonly string DATACONTEXT_KEY = "MyContext_UserInstance";
                    // TODO: read from a place accesible to all deployed projects
                    // remove hardcoded database
                    private static readonly string DefaultConnectionString = @"metadata=res://*/MyContext.csdl|res://*/MyContext.ssdl|res://*/MyContext.msl;provider=System.Data.SqlClient;provider connection string='data source=Server;initial catalog=MyDatabase;integrated security=True;multipleactiveresultsets=True;App=EntityFramework'";
                
                    private static string connectionString;
                    #endregion
                
                    public MyContext(String connectionString) : base(connectionString)
                    {
                    }
                
                    /// <summary>
                    /// Uses a UnitOfWorkStore to return the same instance of MyContext, that is unique
                    /// per user, per postback (or CallContext, if not in an HttpContext environment, such as unit tests or console apps)
                    /// </summary>
                    public static MyContext Instance
                    {
                        get
                        {
                            // Dirty (non thread-safe) check
                            if (UnitOfWorkStore.GetData(DATACONTEXT_KEY) == null)
                            {
                                lock (objSync)
                                {
                                    // Thread-safe check
                                    if (UnitOfWorkStore.GetData(DATACONTEXT_KEY) == null)
                                    {
                                        MyContext context = new MyContext(DefaultConnectionString);
                                        connectionString = context.Database.Connection.ConnectionString;
                                        UnitOfWorkStore.SetData(DATACONTEXT_KEY, context);
                                    }
                                }
                            }
                            return (MyContext)UnitOfWorkStore.GetData(DATACONTEXT_KEY);
                        }
                    }
                
                }
                
                1. 数据上下文应该允许直接连接字符串输入:

                  public MyContext(String connectionString) : base(connectionString) { }

                【讨论】:

                  猜你喜欢
                  • 2013-04-08
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-09-01
                  • 1970-01-01
                  • 2016-05-07
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多