1

我处于使用 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 的任何其他配置,然后删除引发此异常的代码。

亲切的问候

4

2 回答 2

1

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

检查这篇关于配置文件的文章

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" />
于 2014-06-18T11:49:05.240 回答
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 复制到 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"))
    {
    }
}

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

于 2014-06-19T10:41:00.567 回答