Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架6在代码中设置连接字符串_C#_.net_Entity Framework_Dll - Fatal编程技术网

C# 实体框架6在代码中设置连接字符串

C# 实体框架6在代码中设置连接字符串,c#,.net,entity-framework,dll,C#,.net,Entity Framework,Dll,我有一个dll,它使用EntityFramework6来执行一些数据库操作。我使用的是数据库优先的方法。 模型和与实体框架有关的所有内容,如App.config中的连接字符串,都是通过Visual Studio中的wizzard创建的 因此,我编译了dll,并将其与相应的.config放在使用dll的应用程序需要它的文件夹中 在我到达实际数据库调用的位置之前,一切都正常。我得到了一个错误: 找不到MyDatabaseEntity的连接字符串 正如我所说,自动生成的connectionstring

我有一个dll,它使用EntityFramework6来执行一些数据库操作。我使用的是数据库优先的方法。 模型和与实体框架有关的所有内容,如App.config中的连接字符串,都是通过Visual Studio中的wizzard创建的

因此,我编译了dll,并将其与相应的.config放在使用dll的应用程序需要它的文件夹中

在我到达实际数据库调用的位置之前,一切都正常。我得到了一个错误:

找不到MyDatabaseEntity的连接字符串

正如我所说,自动生成的connectionstring位于dll的配置文件中。我无法更改应用程序的App.config。 但是应用程序移交了一个对象,该对象拥有我自己构建连接字符串所需的所有信息。 因此,我正在寻找一种在代码中设置连接字符串而不依赖配置文件的方法。 不过,我发现的所有关于数据库优先方法的教程都使用这种方法。 我在这里找到了一篇帖子,上面说在创建类似

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; }
    }