27

我正在使用多层项目,其中 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=&quot;Data Source=.;Initial Catalog=Phoenix;Integrated Security=True;MultipleActiveResultSets=True&quot;" 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" />

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

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

4

8 回答 8

26

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

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

于 2009-07-11T22:03:19.753 回答
2

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

这不是一个巨大的改进,但至少它为您提供了一些关注点分离。

当 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()。

于 2010-12-28T19:44:44.653 回答
2

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

于 2010-07-16T04:27:40.147 回答
1

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

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

于 2010-11-16T11:26:29.310 回答
0

I had a similar problem with a WinForms project and despite trying everything I could find related to it on the web could not resolve my problem..... until I removed the field that I was using for my ObjectContext (private CubEntities _oc = new CubEntities()) from my BaseForm to the actual form using it.

于 2010-07-06T22:32:49.290 回答
0

我添加了同样的问题,试图对我的 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" /> 
于 2010-01-27T12:41:08.253 回答
0

我遇到了同样的问题,我尝试了所有提到的方法。最后我如前所述解决了它。就我而言,我有单独的数据层和表示层。在我的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>
于 2013-11-13T19:22:41.397 回答
0

我在我的一个项目中遇到了问题,因为作业、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. 数据上下文应允许直接连接字符串输入:

    公共 MyContext(String connectionString) : base(connectionString) { }

于 2015-09-29T15:21:05.840 回答