【问题标题】:Adding ADO.Net Entity Data Model using machine.config connection string使用 machine.config 连接字符串添加 ADO.Net 实体数据模型
【发布时间】:2014-06-18 11:19:14
【问题描述】:

我处于使用 EF6 学习 MVC5 的初级水平。基本上我正在尝试使用在 machine.config 中定义的连接字符串,而不是在创建 ADO.NET 实体数据模型时使用 web.config。我使用 machine.config 作为连接字符串的原因是;我们有不同的 SQL 集群服务器和应用程序服务器。在本地机器上,我们使用本地 SQL Server 实例,但在 beta/Live SQL Server 上,我们使用不同的实例名称。凭证也不同。因此,在每个应用程序/Web 服务器上,我们在 machine.config 中为相同的数据库名称但使用不同的凭据定义了 ConnectionString。

有没有一种方法可以在使用向导创建 ADO.Net 实体数据模型的同时使用 machine.config 中指定的 ConnectionString,或者我可以将 machine.config ConnectionString 的引用提供给我的应用程序 web.config,或者还有其他方法吗解决这个问题?

我正在使用 MVC5 的数据库优先技术。在使用本地数据库创建 edmx 后,我尝试了以下操作,然后尝试在我的上下文类中更改连接字符串:

public partial class MasterDataEntities : DbContext
{
    public MasterDataEntities()
        : base(string.Format("{0}", getConnectionString()))
    {
    }

    public static string getConnectionString()
    {
        Configuration config = ConfigurationManager.OpenMachineConfiguration();
        return config.ConnectionStrings.ConnectionStrings["masterdata"].ConnectionString;
    }

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

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

亲切的问候

【问题讨论】:

    标签: c# asp.net-mvc-5 entity-framework-6 machine.config web-config


    【解决方案1】:

    您可以简单地在 machine.config 中定义您的连接字符串。当您使用配置管理器时,它会先在 machine.config 中查找您的 appsettings,然后再查找您的应用程序配置文件。

    Configuration files查看这篇文章

    string innerConnectionString = ConfigurationManager.ConnectionStrings["Inner"].ConnectionString;
    
    <add name="Inner" connectionString="Data Source=SomeServer;Initial Catalog=SomeCatalog;Persist Security Info=True;User ID=Entity;Password=SomePassword;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" />
    

    【讨论】:

      【解决方案2】:

      在对 MVC 和 EF Database First 方法进行了几次实验后,我发现问题出在 machine.config 的连接字符串上。实体框架不喜欢标准连接字符串。连接字符串必须具有有关 DBContext 资源的元数据信息和 EF 的提供程序名称。我在 machine.config 中的标准 ConnectionString 是:

      <add name="masterDataConnectoinString" connectionString="Data Source=Instance1;Initial Catalog=masterData;Integrated Security=True;"/>
      

      然后我将 ConnectionString 从 web.config 复制到 macing.config,这是我添加实体数据模型 (edmx) 时默认创建的:

      <add name="masterDataConnectionString" connectionString="metadata=res://*/Models.DBContext.csdl|res://*/Models.DBContext.ssdl|res://*/Models.DBContext.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=Instance1;initial catalog=masterData;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
      

      然后指定要使用的连接字符串名称,正如我在 MasterDataEntities 的问题中所示,解决了问题。

      使用 machine.config 的 ConnectionString 会产生另一个问题。如果您修改数据库,例如在任何表中添加另一列并希望使用新更改更新实体数据模型 (edmx),则右键单击 edmx 图,然后单击从数据库更新模型,这将不起作用。向导会要求您指定新的连接,这是不对的。它应该为您提供添加/刷新/删除表或视图或过程。

      为了暂时解决这个问题,我将 connectionString 保留在我的 web.config 中,但注释掉了。如果我必须从数据库中更新模型,请取消注释 web.config connectionString 并设置您的(在我的情况下)MasterDataEntities 以使用 web.config:

      public partial class MasterDataEntities : DbContext
      {
          public MasterDataEntities()
             : base("name=masterDataConnectionString"))
          {
          }
      }
      

      更新模型。如果有人有更好的解决方案,请告诉我。谢谢

      【讨论】:

        猜你喜欢
        • 2013-04-08
        • 1970-01-01
        • 2018-10-03
        • 1970-01-01
        • 1970-01-01
        • 2016-12-11
        • 2018-01-11
        • 2010-11-09
        • 2010-11-22
        相关资源
        最近更新 更多