使用machine.config连接字符串添加ADO.Net实体数据模型

时间:2014-06-18 11:19:15

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

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

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

我使用的是使用MVC5的Database First技术。我在使用本地数据库创建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,请确保在执行应用程序的配置文件中指定了Entity Framework连接字符串。要使用从Database First或Model First生成的这些类,使用Code First添加任何其他配置,使用属性或DbModelBuilder API,然后删除引发此异常的代码。

亲切的问候

2 个答案:

答案 0 :(得分: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" />

答案 1 :(得分:0)

在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复制到maching.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 Diagram,然后单击“从数据库更新模型”,这将无效。向导将要求您指定新连接,这是不对的。它应该为您提供添加/刷新/删除表或视图或过程。

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

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

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