繁体   English   中英

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

[英]Adding ADO.Net Entity Data Model using machine.config connection string

我处于使用EF6学习MVC5的初级水平。 基本上,我在创建ADO.NET实体数据模型时尝试使用在machine.config中定义的连接字符串,而不是使用web.config。 我对连接字符串使用machine.config的原因是; 我们有不同的SQL Cluster服务器和应用程序服务器。 在本地计算机上,我们使用本地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生成的这些类以及Code First,请使用属性或DbModelBuilder API添加任何其他配置,然后删除引发此异常的代码。

亲切的问候

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

配置文件上查看此文章

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" />

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM