实体框架:动态连接字符串出错

本文关键字:字符串 出错 连接 动态 框架 实体 | 更新日期: 2023-09-27 18:25:00

干杯,

我使用的是实体框架模型。我需要传递类似连接字符串的参数,所以,在另一个文件中,我(根据这个问题)写了:

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

说:

附加信息:如果在代码优先模式下使用,则使用T4模板为数据库优先和模型优先开发生成的代码可能无法正常工作。若要继续使用数据库优先或模型优先,请确保在运行的应用程序的配置文件中指定了实体框架的连接字符串。若要使用这些从数据库优先或模型优先生成的类,请使用代码优先添加使用属性或API DbModelBuilder的任何其他配置,并删除引发此异常的代码。

堆叠道是:

在c:中的MyNamespace.Model.MyEntitys.OnModelCreating(DbModelBuilder modelBuilder)中。。。''Model''Model.Context.cs:row 25在System.Data.Entity.DbContext.CallOnModelCreating(DbModelBuilder modelBuilder)中在System.Data.Entity.Interal.LazyInternalContext.CreateModelBuilder()中在System.Data.Entity.Interal.LazyInternalContext.CreateModel中(LazyInternalContext internalContext)在System.Data.Entity.Interal.RetryLazy`2.GetValue(TInput输入)*中

InnerException为null。

错误在哪里?

实体框架:动态连接字符串出错

不能通过构造函数将简单类型的连接字符串用作实体框架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;";

我认为您必须更新App.config部分

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

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