我正在使用多层项目,其中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="Data Source=.;Initial Catalog=Phoenix;Integrated Security=True;MultipleActiveResultSets=True"" providerName="System.Data.EntityClient" />
还尝试了其他组合来引用被调用项目目录的根目录,但没有运气。
非常感谢任何帮助。非常感谢一如既往:)。
答案 0 :(得分:25)
您必须将这些连接字符串放在每个应用程序app.config文件中。如果您有一个生成模型的DAL,然后尝试在EXE中使用DAL,则会发生同样的事情。 EXE不知道连接字符串。
我发现最简单的事情就是在每个项目上放置一个app.config,然后从DAL复制连接字符串我最初生成的模型。然后每个都将拥有相同连接字符串的副本。
答案 1 :(得分:2)
如果您将App.Config
文件复制到主项目中并将所有"
替换为正常'
字符,则应该运行
答案 2 :(得分:2)
我建议对上面给出的建议略有不同。
这不是一个巨大的改进,但至少它会让你分离一些问题。
当EF向导创建.edmx文件及其关联的.Designer .cs
文件时,C#代码声明了一个部分类。因此,您只需将另一个.cs
文件添加到包含两个EDM文件的项目中即可。
这个新文件为同一名称空间和类定义了一个额外的静态函数。
这个新的静态函数将返回所需类型的实例(ObjectContext的后代)。
新文件是一个单独的文件,因此如果重新创建.edmx和.Designer.cs,它将不会被覆盖。
您从EDM项目的.config中复制并粘贴连接字符串,这是一种破解,但至少它会使连接字符串隐藏在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()。
答案 3 :(得分:1)
我将entityconnectionstring传递给了objectContext类的所有实例,并且它现在正在工作。
但它的开销过大,使用connectionstring创建一个属性并将其作为参数传递给每个实例
答案 4 :(得分:0)
我添加了同样的问题,试图对我的DAL进行单元测试。我发现这有效:
<add name="SalesEntities" connectionString="metadata=res://*;provider=System.Data.SqlClient;provider connection string="Data Source=.;Initial Catalog=Phoenix;Integrated Security=True;MultipleActiveResultSets=True"" providerName="System.Data.EntityClient" />
答案 5 :(得分:0)
我在WinForms项目中遇到了类似的问题,尽管我在Web上找到与它相关的所有内容都无法解决我的问题.....直到我删除了我用于ObjectContext的字段(私有CubEntities) _oc = new CubEntities())从我的BaseForm到使用它的实际表单。
答案 6 :(得分:0)
我遇到了同样的问题&amp;我尝试了所有提到的方法。最后我按照提到的解决了它。在我的情况下,我有单独的数据层和表示层。在我的app.config
(数据层)中,我有这样的连接。
<add name="LibraryMgtSysEntities" connectionString="metadata=res://*/DataLibraryMgtSys.csdl|res://*/DataLibraryMgtSys.ssdl|res://*/DataLibraryMgtSys.msl;provider=System.Data.SqlClient;provider connection string="data source=abc;initial catalog=LibraryMgtSys;Persist Security Info=True;user id=sa;password=123;MultipleActiveResultSets=True"" providerName="System.Data.EntityClient" />
在我web.config
i手动配置的连接中,如下所示:
<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="data source=TILANITHOTAMUNE\SQLEXPRESS;initial catalog=LibraryMgtSys;Persist Security Info=True;user id=sa;password=testing;MultipleActiveResultSets=True"" 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>
答案 7 :(得分: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);
}
}
}
数据上下文应该允许直接连接字符串输入:
public MyContext(String connectionString):base(connectionString) { }