【问题标题】:Usage of DbContext(string nameOrConnectionString)DbContext 的使用(字符串名称或连接字符串)
【发布时间】:2015-05-19 08:03:01
【问题描述】:

我想使用构造函数建立数据库连接

DbContext(字符串名称或连接字符串)

但我不想使用应用程序配置文件来做到这一点。像这样

配置文件中的行

  <add name="DBEntities" connectionString="metadata=res://*/DB.csdl|
    res://*/DB.ssdl|res://*/DB.msl;provider=System.Data.SqlClient;
    provider connection string=&quot;data source=SERVER;
    initialcatalog=DB;persist security info=True;
    user id=XXX;password=YYY;MultipleActiveResultSets=True;
    App=EntityFramework&quot;" providerName="System.Data.EntityClient" />

代码中的一行

public DBEntities() : base("name=DBEntities"){}

在代码中直接声明我想要这样的东西

 public DBEntities() : base("connectionString=metadata=
 res://*/DB.csdl|res://*/DB.ssdl|res://*/DB.msl;
 provider=System.Data.SqlClient;provider connection string=&quot;
 data source=SERVER;initial catalog=DB;
persist security info=True;
userid=XXX;password=YYY;MultipleActiveResultSets=True;
App=EntityFramework&quot;"){}

如果我尝试这样做,我有 'System.ArgumentException': Keyword not supported: 'connectionstring'。

有可能吗?如何做我想做的事?

【问题讨论】:

  • 你试过了吗?
  • 是的。导致问题更新

标签: c# sql-server entity-framework


【解决方案1】:

问题似乎是双重的:

  1. 您已在连接字符串中包含属性名称connectionString
  2. " 需要替换为 '

那么正确的代码应该变成:

public DBEntities()
    : base("metadata=res://*/DB.csdl|res://*/DB.ssdl|res://*/DB.msl;provider=System.Data.Sq‌​‌​lClient;provider connection string='data source=SERVER;initial catalog=DB;persist security info=True;userid=XXX;password=YYY;MultipleActiveResultSets=True;App=EntityFramew‌​‌​ork'")
{}

您可以查看here 了解有关连接字符串所包含元素的更多详细信息,查看here 了解有关实体框架连接字符串的更多详细信息。

老答案,供参考:

问题似乎在于您包含了 web.config 用于定义连接字符串的所有内容。连接字符串本身只是属性connectionString之后的引号之间包含的内容,在您的情况下为data source=SERVER;initial catalog=DB;persist security info=True;userid=XXX;password=YYY;MultipleActiveResultSets=True;App=EntityFramework。

试试这个:

public DBEntities() : base("data source=SERVER;initial catalog=DB;
  persist security info=True;
  userid=XXX;password=YYY;MultipleActiveResultSets=True;
  App=EntityFramework"){}

此外,您可以查看here 以获取有关连接字符串所包含元素的更多详细信息。

【讨论】:

  • 没有。我有这个'System.Data.Entity.Infrastructure.UnintentionalCodeFirstException'
  • 啊,代码先生成表格?那么你需要更多,我认为如下:metadata=res://*/DB.csdl|res://*/DB.ssdl|res://*/DB.msl;provider=System.Data.SqlClient;provider connection string=&amp;quot;data source=SERVER;initial catalog=DB;persist security info=True;userid=XXX;password=YYY;MultipleActiveResultSets=True;App=EntityFramework&amp;quot;
  • 不支持关键字:“数据源”。 :)
  • 我认为我们走在正确的轨道上。您可以尝试使用 ' 而不是 " 吗?即,metadata=res://*/DB.csdl|res://*/DB.ssdl|res://*/DB.msl;provider=System.Data.Sq‌​lClient;provider connection string='data source=SERVER;initial catalog=DB;persist security info=True;userid=XXX;password=YYY;MultipleActiveResultSets=True;App=EntityFramew‌​ork'
  • 太棒了!将根据这些 cmets 更新答案:)
【解决方案2】:

在你的Model.Context.tt的构造函数下添加以下内容;

public <#=code.Escape(container)#>(string connStr)
    : base(connStr)
{
<#
if (!loader.IsLazyLoadingEnabled(container))
{
#>
    this.Configuration.LazyLoadingEnabled = false;
<#
}

foreach (var entitySet in container.BaseEntitySets.OfType<EntitySet>())
{
// Note: the DbSet members are defined below such that the getter and
// setter always have the same accessibility as the DbSet definition
if (Accessibility.ForReadOnlyProperty(entitySet) != "public")
{
#>
    <#=codeStringGenerator.DbSetInitializer(entitySet)#>
<#
}
}
#>
}

重建后,您现在将拥有第二个构造函数,采用string 参数connStr;

public DBEntities() : base("name=DBEntities"){}
public DBEntities(string connStr) : base(connStr){}

您现在可以在代码中创建自己的连接字符串并将其传递给构造函数。示例;

public string connStr = "your connection string";

using (var db = new DBEntities(connStr))
{
    //do things with db
}

【讨论】:

    【解决方案3】:

    问题在于您的连接字符串传递给构造函数。 试试这个:

    private const string _connectionString = @"data source=SERVER;initial catalog=DB;persist security info=True;user id=XXX;password=YYY;MultipleActiveResultSets=True";
    public DBEntities() : base(_connectionString)
    {
    }
    

    【讨论】:

    • 我在 MapX.Model.dll 中发生了此“System.Data.Entity.Infrastructure.UnintentionalCodeFirstException”,但未在用户代码中处理其他信息:使用 T4 模板为 Database First 和 Model 生成的代码如果在 Code First 模式下使用,首次开发可能无法正常工作。
    猜你喜欢
    • 1970-01-01
    • 2021-05-26
    • 1970-01-01
    • 1970-01-01
    • 2021-08-02
    • 2016-11-18
    • 2021-06-25
    • 2014-02-05
    • 2012-02-23
    相关资源
    最近更新 更多