2009-08-24 105 views
6

我有一个包含两个项目.NET解决方案:两个.NET项目,一个数据库连接字符串?

  • 一个ASP.NET MVC项目, '网站'
  • 一个类库, '模型'

的 '模型' 项目包含一个Linq-to-SQL数据上下文以及一些扩展数据库对象的分类。

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

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

这意味着如果连接字符串发生变化,我将不得不更新这两个项目。

有没有办法将连接字符串集中到一个地方,还有两个项目都使用它?

回答

4

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

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

     if (cs != null) 
     { 
      this.Connection.ConnectionString = cs.ConnectionString; 
     } 
    } 
} 

看到这个问题的更多信息Preferred Method for connection string in class library
RichardOD发布一个链接,我认为最能描述我们的问题LINQ To SQL and the Web.Config ConnectionString Value

+0

什么是反对票? – Breadtruck 2009-08-24 19:31:24

+2

但是这将如何工作,因为部分类必须属于同一个程序集?我希望'Models'程序集使用'网站'程序集中web.config中的连接字符串。 – Jonathan 2009-08-25 03:17:34

+0

顺便说一句,我没有做任何downvoting。 – Jonathan 2009-08-25 03:46:14

1

我想说,你应该保持产品的配置在web项目的web.config中,然后将你使用的配置注入到模型项目中。

+0

这是我做的。见我的回答实际的代码示例 – Breadtruck 2009-08-24 14:46:47

2

这很好。将模型的连接字符串放入Web.config中,并忘记(删除)模型的配置文件。

DataContext的也需要在其构造连接字符串中,所以你可以用这种方式太指定它(也许不是,虽然一行):

DataContext context = new DataContext(ConfigurationManager.ConnectionStrings["TheKey"].ConnectionString); 

编辑 - 根据您的意见,它看起来其他答案就像你做错了什么一样。如果你这样做,那么生成的代码将使用默认设置值。

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

您可能在Web.config文件中犯了not specifying the connection string properly错误。

+0

@RichardOD:我评论,但我实际上并没有提出这样的问题,虽然我曾问一个类同这一个而回。我从来没有试图删除appconfig文件。我的阿姨曾经提出过这个问题,但我也在项目中使用了一些数据集模型,在这种情况下,您必须创建大量的部分tableadapter类,并且我不打算这么做,所以我没有尝试删除该应用程序。配置,但我想它会起作用。 – Breadtruck 2009-08-24 14:57:22

0

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

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

+0

这不是我的经验,除非我配置了错误的东西。 – Breadtruck 2009-08-24 14:46:09

+0

真的吗?你在使用第三方组件吗?因为根据我的经验,系统默认只读取可执行文件的app.config(或者ASP.NET web.config的情况)。如果有一个与类库(.DLL)关联的app.config,则该app.config的内容必须是A)手动加载(这是为您执行此操作的第三方组件)或B)复制到主应用程序的app.config/web.config。 – Randolpho 2009-08-24 18:02:44

+0

@Randolpho:请参阅http://stackoverflow.com/questions/1148559了解更多关于我的说明。 – Breadtruck 2009-08-24 19:15:38

0

我认为模型库中的连接字符串仅供设计人员使用。在运行时,字符串从web.config加载。所以你不一定需要让字符串同步。

+0

这不是我在将这样的解决方案部署到生产环境中后发现的。该库继续从app.config中获取连接。 – Breadtruck 2009-08-24 14:45:11

0

你不需要类库的app.config。只需将您的配置置于web.config。另外,如果你需要图书馆的应用程序的一些配置部分。配置,只要把它放在web.config。 ConfigurationManager将从那里读取它。

0

如果你的模型类库在Web应用程序中引用,你可以简单地删除app.config文件参考,并确保你有类似放置在你的网站的东西。配置。这样,当编译器在web.config中查找时,它会找到它需要的MVC项目的连接字符串,因此不需要进一步查看它。

+0

我试过了,但它好像是从Models项目属性下的'Settings'文件中获取连接字符串。有这样的类中的一些代码:“全球:: Models.Properties.Settings.Default.WebConnectionString,mappingSource)” – Jonathan 2009-08-25 03:44:59

+0

@jonathanconroy:这也正是我的回答将帮助你解决这个问题。 – Breadtruck 2009-08-25 12:18:00

0

就个人而言,我在程序存储库扩展的DataContext然后像做:

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

这样,我的仓库被实例化,我从来不担心建立连接,也不必任何处理。要改变/从开发/实时数据库,我只是改变我的web.config。

0

库中的的app.config不会影响生产 - 这些连接字符串是真的存在的LINQ2SQL设计师。没什么可看的,移动,这些不是我们正在寻找的机器人。 。 。