【问题标题】:Entity Framework 6 set connection string in codeEntity Framework 6 在代码中设置连接字符串
【发布时间】:2015-12-18 07:55:45
【问题描述】:

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

所以我编译了 dll 并将其与相应的 .config 放在一起,放在使用 dll 的应用程序所期望的文件夹中。

在我进行实际数据库调用之前,一切正常。我得到了错误:

找不到 MyDatabaseEntity 的连接字符串

如我所说,自动生成的连接字符串在 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; }
}

【问题讨论】:

  • 我们如何使用 DB First 来做到这一点。它会覆盖我文件中的任何更改吗?

标签: c# .net entity-framework dll


【解决方案1】:

怎么样:

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

}

然后像以前一样初始化数据库:

string myConnectionString = "...";
MyDatabaseEntities = new MyDatabaseEntities(myConnectionString);

【讨论】:

  • 我不知道 base() 处的字符串是连接字符串。谢谢你,做到了。
  • 是的,它会尝试在您的启动项目的配置文件中查找括号中指定名称的连接字符串
  • @Dev-Systematix 你不能用&amp;quot,用单引号'代替。
  • 如果我们不使用 EntityConnectionStringBuilder 那么它就不会识别 Data Source 关键字并引发异常
  • 我试过这个但有一个异常:UnintentionalCodeFirstException: 'The context is being used in Code First mode with code that was generated from an EDMX file for either Database First or Model First development. This will not work correct ... 为了摆脱它,我删除了这一行:throw new UnintentionalCodeFirstException();,但还有其他问题,每次我Update model from database部分DbContext 类正在重新生成,我丢失了修改
【解决方案2】:

我有类似的问题。我的 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));

【讨论】:

  • 谢谢。如果您提到部分类重载在另一个文件而不是默认的 Context.cs 上可能会更好,因为它是由 Visual Studio 自动生成的,并且可能被 Visual Studio 覆盖。
  • @Mahib,我已经尝试了你的步骤,但第一次调用 DB proc 工作正常,但下次当我调用下一个 DbProc 时,它会因超时相关错误而失败。任何建议表示赞赏。
【解决方案3】:

我使用下面的代码得到了这个解决方案,我可以使用 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);

【讨论】:

  • 对于属性ProviderConnectionString的分配,您可以使用sqlString.ConnectionString
【解决方案4】:

非常感谢。我对 Code First 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;
        }
    }
}

【讨论】:

    【解决方案5】:

    你可以使用单例模式。例如

    private YouurDBContext context;
    
        public YouurDBContext Context
        {
            get
            {
                if (context==null)
                {
                    context = new YouurDBContext();
                }
                return context;
    
            }
            set { context = value; }
        }
    

    【讨论】:

      猜你喜欢
      • 2015-06-09
      • 2011-03-14
      • 2022-10-25
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      • 2014-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多