C# 实体框架6在代码中设置连接字符串
我有一个dll,它使用EntityFramework6来执行一些数据库操作。我使用的是数据库优先的方法。 模型和与实体框架有关的所有内容,如App.config中的连接字符串,都是通过Visual Studio中的wizzard创建的 因此,我编译了dll,并将其与相应的.config放在使用dll的应用程序需要它的文件夹中 在我到达实际数据库调用的位置之前,一切都正常。我得到了一个错误: 找不到MyDatabaseEntity的连接字符串 正如我所说,自动生成的connectionstring位于dll的配置文件中。我无法更改应用程序的App.config。 但是应用程序移交了一个对象,该对象拥有我自己构建连接字符串所需的所有信息。 因此,我正在寻找一种在代码中设置连接字符串而不依赖配置文件的方法。 不过,我发现的所有关于数据库优先方法的教程都使用这种方法。 我在这里找到了一篇帖子,上面说在创建类似C# 实体框架6在代码中设置连接字符串,c#,.net,entity-framework,dll,C#,.net,Entity Framework,Dll,我有一个dll,它使用EntityFramework6来执行一些数据库操作。我使用的是数据库优先的方法。 模型和与实体框架有关的所有内容,如App.config中的连接字符串,都是通过Visual Studio中的wizzard创建的 因此,我编译了dll,并将其与相应的.config放在使用dll的应用程序需要它的文件夹中 在我到达实际数据库调用的位置之前,一切都正常。我得到了一个错误: 找不到MyDatabaseEntity的连接字符串 正如我所说,自动生成的connectionstring
MyDatabaseEntities = new MyDatabaseEntities(dbConnect);
但是“MyDatabaseEntities”没有接受任何参数的构造函数
public partial class MyDatabaseEntities : DbContext
{
public MyDatabaseEntities()
: base("name=MyDatabaseEntities")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}
public virtual DbSet<MyTable> MyTable { get; set; }
}
公共部分类MyDatabaseEntities:DbContext
{
公共MyDatabaseEntities()
:base(“name=MyDatabaseEntities”)
{
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
抛出新代码FirstException();
}
公共虚拟数据库集MyTable{get;set;}
}
那么:
public partial class MyDatabaseEntities : DbContext
{
public MyDatabaseEntities(string connectionString)
: base(connectionString)
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}
public virtual DbSet<MyTable> MyTable { get; set; }
我使用下面的代码得到了这个解决方案,我可以使用C代码硬编码连接字符串,而不使用配置文件
public class SingleConnection
{
private SingleConnection() { }
private static SingleConnection _ConsString = null;
private String _String = null;
public static string ConString
{
get
{
if (_ConsString == null)
{
_ConsString = new SingleConnection { _String = SingleConnection.Connect() };
return _ConsString._String;
}
else
return _ConsString._String;
}
}
public static string Connect()
{
//Build an SQL connection string
SqlConnectionStringBuilder sqlString = new SqlConnectionStringBuilder()
{
DataSource = "SIPL35\\SQL2016".ToString(), // Server name
InitialCatalog = "Join8ShopDB", //Database
UserID = "Sa", //Username
Password = "Sa123!@#", //Password
};
//Build an Entity Framework connection string
EntityConnectionStringBuilder entityString = new EntityConnectionStringBuilder()
{
Provider = "System.Data.SqlClient",
Metadata = "res://*/ShopModel.csdl|res://*/ShopModel.ssdl|res://*/ShopModel.msl",
ProviderConnectionString = @"data source=SIPL35\SQL2016;initial catalog=Join8ShopDB2;user id=Sa;password=Sa123!@#;"// sqlString.ToString()
};
return entityString.ConnectionString;
}
并使用DbContext,如下所示:
Join8ShopDBEntities dbContext = new Join8ShopDBEntities(SingleConnection.ConString);
我也有类似的问题。我的Edmx和App.Config在另一个项目中。我的启动项目不同,有3个不同的连接字符串,我们需要根据环境动态选择一个。因此无法使用固定连接字符串。我使用相同的名称空间创建了Context.cs的部分类重载。以下是我默认的Context.cs
namespace CW.Repository.DBModel
{
public partial class CWEntities : DbContext
{
public CWEntities()
: base("name=CWEntities")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}
...
...
}
}
我的部分班级超载
namespace CW.Repository.DBModel
{
public partial class CWEntities : DbContext
{
public CWEntities(string ConnectionString)
: base(ConnectionString)
{
}
}
}
最后,由于我的连接字符串不是EF的,所以我将它们转换为EF连接字符串
public static string GetEntityConnectionString(string connectionString)
{
var entityBuilder = new EntityConnectionStringBuilder();
// WARNING
// Check app config and set the appropriate DBModel
entityBuilder.Provider = "System.Data.SqlClient";
entityBuilder.ProviderConnectionString = connectionString + ";MultipleActiveResultSets=True;App=EntityFramework;";
entityBuilder.Metadata = @"res://*/DBModel.CWDB.csdl|res://*/DBModel.CWDB.ssdl|res://*/DBModel.CWDB.msl";
return entityBuilder.ToString();
}
最后,电话
var Entity = new CWEntities(CWUtilities.GetEntityConnectionString(ConnectionString));
非常感谢。对于代码优先的EF6,我几乎没有改变
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data.Entity.Core.EntityClient;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Data
{
public class SingleConnection
{
private SingleConnection() { }
private static SingleConnection _ConsString = null;
private String _String = null;
public static string ConString
{
get
{
if (_ConsString == null)
{
_ConsString = new SingleConnection { _String = SingleConnection.Connect() };
return _ConsString._String;
}
else
return _ConsString._String;
}
}
public static string Connect()
{
string conString = ConfigurationManager.ConnectionStrings["YourConnectionStringsName"].ConnectionString;
if (conString.ToLower().StartsWith("metadata="))
{
System.Data.Entity.Core.EntityClient.EntityConnectionStringBuilder efBuilder = new System.Data.Entity.Core.EntityClient.EntityConnectionStringBuilder(conString);
conString = efBuilder.ProviderConnectionString;
}
SqlConnectionStringBuilder cns = new SqlConnectionStringBuilder(conString);
string dataSource = cns.DataSource;
SqlConnectionStringBuilder sqlString = new SqlConnectionStringBuilder()
{
DataSource = cns.DataSource, // Server name
InitialCatalog = cns.InitialCatalog, //Database
UserID = cns.UserID, //Username
Password = cns.Password, //Password,
MultipleActiveResultSets = true,
ApplicationName = "EntityFramework",
};
//Build an Entity Framework connection string
EntityConnectionStringBuilder entityString = new EntityConnectionStringBuilder()
{
Provider = "System.Data.SqlClient",
Metadata = "res://*",
ProviderConnectionString = sqlString.ToString()
};
return entityString.ConnectionString;
}
}
}
您可以使用单例模式。比如说
private YouurDBContext context;
public YouurDBContext Context
{
get
{
if (context==null)
{
context = new YouurDBContext();
}
return context;
}
set { context = value; }
}
我不知道base()处的字符串就是连接字符串。谢谢,成功了。是的,它尝试在启动的配置文件中找到括号中指定名称的connectionstringproject@Dev-SYSTEMAIX您不能使用
,
,改为使用单引号”
。如果我们不使用EntityConnectionStringBuilder,则它将不会识别数据源关键字并引发异常我尝试了此操作,但得到了异常:意外的CodeFirstException:“上下文正在代码优先模式下使用,代码是从EDMX文件中首先为任一数据库生成的或模型优先开发。这将无法正常工作…
为了消除这一点,我删除了以下行:抛出新的意外CodeFirstException()代码>,但还有另一个问题,那就是每次我从数据库更新模型时,DbContext
部分类都会被重新生成,而我丢失了修改。我们如何首先使用数据库来完成这项工作。它将覆盖我文件中的任何更改?谢谢。如果您提到部分类重载位于另一个文件而不是默认的Context.cs上,则会更好,因为它是由Visual Studio自动生成的,可能会被Visual Studio覆盖。@Mahib,我已经尝试了您的步骤,但是第一次调用DB proc工作正常,但是下次调用next DbProc时失败,出现与超时相关的错误。欢迎任何建议。要分配属性ProviderConnectionString
,可以使用sqlString.ConnectionString
。
private YouurDBContext context;
public YouurDBContext Context
{
get
{
if (context==null)
{
context = new YouurDBContext();
}
return context;
}
set { context = value; }
}