【问题标题】:Entity Framework: Error with dynamic connection string实体框架:动态连接字符串出错
【发布时间】:2015-10-14 18:37:18
【问题描述】:

大家好,

我正在使用实体框架模型。我需要像参数一样传递我的连接字符串,所以,在另一个文件中,我写了(来自this question):

namespace MyNamespace.Model
{
    using System;
    using System.Data.Entity;
     using System.Data.Entity.Infrastructure;

    public partial class MyEntities: DbContext
    {
        public MyEntities(string nameOrConnectionString) : base(nameOrConnectionString)
        {

        }
    }
}

当我启动应用程序时,我以这种方式调用这个构造函数,所以我可以在应用程序中引用这个:

public static MyEntities dbContext = 
                         new MyEntities(mdlImpostazioni.SetConnectionString());

其中mdlImpostazioni.SetConnectionString()返回一个字符串(数据正确):

server=192.168.1.100\SVILUPPO;database=MyDB;uid=myName;pwd=111111;

当我执行这段代码时,似乎一切正常,但是当我尝试进行如下查询时:

var query = (from r in MainWindow.dbContext.TabTipoSistema select r);

它从这里抛出一个异常:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    throw new UnintentionalCodeFirstException();
}

说:

附加信息:如果在 Code First 模式下使用,使用 T4 模板生成的用于 Database First 和 Model First 开发的代码可能无法正常工作。要继续使用 Database First 或 Model First,请确保在运行的应用程序的配置文件中指定了 Entity Framework 的连接字符串。要将这些从 Database First 或 Model First 生成的类与 Code First 一起使用,请使用属性或 API DbModelBuilder 添加任何其他配置,并删除引发此异常的代码。

堆栈跟踪是:

在 MyNamespace.Model.MyEntities.OnModelCreating(DbModelBuilder modelBuilder) 在 c:...\Model\Model.Context.cs:row 25 在 System.Data.Entity.DbContext.CallOnModelCreating(DbModelBuilder modelBuilder) 在 System.Data.Entity.Internal.LazyInternalContext.CreateModelBuilder() 在 System.Data.Entity.Internal.LazyInternalContext.CreateModel(LazyInternalContext internalContext) 在 System.Data.Entity.Internal.RetryLazy`2.GetValue(TInput 输入)*

InnerException 为空。

错误在哪里?

【问题讨论】:

    标签: c# database entity-framework database-connection connection-string


    【解决方案1】:

    你不能只使用简单类型的连接字符串作为实体框架 6 通过构造函数连接字符串。 我只是使用以下函数来获得一个实体兼容的。

    不要忘记将“YourDBModel”更改为您正在使用的任何模型。

        /// <summary>
        /// Returns an Entity Connectionstring ready to be used in a EF6 contructor
        /// </summary>
        /// <param name="connectionString">plain connectionstring</param>
        /// <returns>entity connectionstring</returns>
        public string GetEntityConnectionString(string connectionString)
        {
            var entityBuilder = new EntityConnectionStringBuilder();
    
            entityBuilder.Provider = "System.Data.SqlClient";
            entityBuilder.ProviderConnectionString = connectionString;
    
            // -- WARNING --
            // Check your app config and set the appropriate DBModel (do not just let this be YourDBModel) 
            entityBuilder.Metadata = @"res://*/DB.YourDBModel.csdl|res://*/DB.YourDBModel.ssdl|res://*/DB.YourDBModel.msl";
    
            var ret = entityBuilder.ToString();
    
            return ret;
        }
    

    您可能还想将以下内容添加到您的连接字符串中

    entityBuilder.ProviderConnectionString = connectionString;  + ";MultipleActiveResultSets=True;App=EntityFramework;";
    

    【讨论】:

      【解决方案2】:

      我相信你必须更新你的 App.config 部分

      不确定,但这对我有用,因为我使用的是 SQLServer 而不是本地文件。

      <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework">
        <parameters>
          <parameter value="Data Source=MyServer; Integrated Security=True; MultipleActiveResultSets=True" />
        </parameters>
      </defaultConnectionFactory>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-01
        • 2011-11-04
        相关资源
        最近更新 更多