两个.NET项目,一个DB连接字符串?

两个.NET项目,一个DB连接字符串?,.net,asp.net-mvc,configuration,connection-string,.net,Asp.net Mvc,Configuration,Connection String,我有一个包含两个项目的.NET解决方案: ASP.NET MVC项目“网站” 类库“模型” “Models”项目包含一个linqtosql数据上下文以及一些扩展数据库对象的分部类 连接字符串在“网站”项目的web.config中定义 然而,“Models”项目似乎有自己的app.config,其中数据库连接是单独定义的 这意味着,如果连接字符串更改,我将不得不更新这两个项目 是否有一种方法可以将连接字符串集中到一个位置,并且仍然让两个项目都使用它?我认为您应该将产品的配置保留在web项目的w

我有一个包含两个项目的.NET解决方案:

  • ASP.NET MVC项目“网站”
  • 类库“模型”
“Models”项目包含一个linqtosql数据上下文以及一些扩展数据库对象的分部类

连接字符串在“网站”项目的web.config中定义

然而,“Models”项目似乎有自己的app.config,其中数据库连接是单独定义的

这意味着,如果连接字符串更改,我将不得不更新这两个项目


是否有一种方法可以将连接字符串集中到一个位置,并且仍然让两个项目都使用它?

我认为您应该将产品的配置保留在web项目的web.config中,然后将您使用的配置注入到模型项目中。

。将模型的连接字符串放在Web.config中,然后忘记(删除)模型的配置文件

DataContext还将在其构造函数中接收连接字符串,因此您也可以通过这种方式指定它(但可能不是在一行上):

编辑-根据你对其他答案的评论,看起来你做错了什么。如果这样做,则生成的代码将使用默认设置值

System.Configuration.DefaultSettingValueAttribute("Data Source=SERVER;Initial Catalog=XYZ;Integrated Security=True")].

您可能在Web.config文件中犯了错误。

好的,我在这里猜测,但看起来两个项目使用的连接字符串相同,是吗


在这种情况下,仅在web.config中指定连接字符串;ASP.NET无论如何都不会读取类库app.config

我认为模型库中的连接字符串只是设计者使用的。在运行时,从web.config加载字符串。因此,您不一定需要同步字符串。

创建一个与数据上下文相同的分部类,并使用此代码强制使用web.config字符串而不是app.config。将分部类放在类库中与模型相同的位置

public partial class YourDataContext 
{
    partial void OnCreated()
    {
        ConnectionStringSettings cs = ConfigurationManager.ConnectionStrings["PrimaryConnectionString"];

        if (cs != null)
        {
             this.Connection.ConnectionString = cs.ConnectionString;
        }
    }
}
有关更多信息,请参见此问题

RichardOD发布了一个链接,指向我认为最能描述我们问题的内容

您不需要类库app.config。只需将您的配置放在web.config。此外,如果您需要库的app.config中的一些配置部分,只需将其放在web.config上即可。ConfigurationManager将从那里读取它。

如果您的Web应用程序中引用了您的模型类库,您只需删除App.Config文件中的引用,并确保您具有与Web应用程序中放置的类库类似的内容。配置。这样,当编译器在web.config中查找时,它将找到MVC项目所需的连接字符串,因此无需进一步查找该字符串。

我个人在Respository中扩展DataContext,然后执行以下操作:

public ContractsControlRepository()
      : base(ConfigurationManager.ConnectionStrings["AccountsConnectionString"].ToString()) { }

这样,我的存储库就可以被实例化,我从不担心建立连接,也不必处理任何事情。要更改到dev/live数据库或从dev/live数据库更改,我只需更改web.config。

库中的app.config不会影响生产--这些连接字符串实际上是用于linq2sql设计器的。没什么可看的,走吧,这些不是我们要找的机器人

这不是我在将这样的解决方案部署到生产环境中后发现的情况。库继续从app.config.com上拉连接,这不是我的经验,除非我配置了错误的东西。真的吗?您是否正在使用第三方组件为您执行此操作?因为根据我的经验,默认情况下系统只读取可执行文件的app.config(或者在ASP.NET web.config的情况下)。如果存在与类库(.DLL)关联的app.config,则该app.config的内容必须是手动加载的(这是为您执行此操作的第三方组件所做的)或者B)复制到主应用程序的app.config/web.config中。@Randolpho:请查看与我相关的更多说明。@Randolpho:顺便说一句,我没有投你的反对票,也有人投了我的反对票。@RichardOD:我在评论,但我实际上没有问这个问题,尽管我前一段时间问过一个类似的问题。我从未试图删除appconfig文件。我阿姨提出了这个建议,但我在项目中也有一些数据集模型,在这种情况下,你必须创建许多分部tableadapter类,我不打算这样做,所以我没有尝试删除app.config,但我想它会起作用。但是,由于分部类必须属于同一个程序集中,这将如何起作用呢?我希望'Models'程序集使用'Website'程序集中的web.config中的连接字符串。顺便说一句,我没有进行任何向下投票。上面的代码将尝试将连接字符串设置为它将在web.config中找到的“PrimaryConnectionString”,因为配置管理器将在其中查找。否则,如果该值为null,onCreated方法将继续并使用设计器生成的数据上下文类中的默认信息。RichardOD发布了一个很好的链接,讨论了整个主题。你也可以试着阅读我在这方面的类似问题,我可能还补充说,我称我的app.config连接字符串与我的web CS不同,“SecondaryConnectionString”相信我,它会工作的,因为我在我的项目中就是这样做的。将该分部类放在与模型相同的位置,然后查看!我尝试了这个,但它似乎是从模型项目属性下的“设置”文件中获取连接字符串。类中有一些类似的代码:@jonathanconroy:“global::Models.Properties.Settings.Default.WebConnectionString,mappingSource)”@jonathanconroy:这正是我的答案可以帮助您解决这个问题的原因。
public ContractsControlRepository()
      : base(ConfigurationManager.ConnectionStrings["AccountsConnectionString"].ToString()) { }