none
三层结构的Linq项目,在发布的时候,如何配置数据库连接文件 RRS feed

  • 问题

  • 我有一个三层结构的项目,其中Linq是放在Dal层,在Dal层有个Properties的Settings.settings可以配Linq 的连接数据库串。(因为Dal层是独立的,无法用到页面层的Web.config 的连接字串)在开发的时候就正常的,但是一到发布,发现发布文件里面会编译成Bin目录下的一个Dal.dll文件,并没有找到一个Settings的文件,感觉连接数据库的字串也编译在Dll里面了(我试过放一个Dal.dll.config到Bin目录,但是不起作用),如果数据库改了地址,变成要重新改工程里面的配置再重新发布,而不能改配置。上网找了半天找不到解决的办法,请哪位碰到相同情况的帮帮忙。

    感激!感激!

    2010年6月23日 2:29

答案

  • 其实这个可以理解为依赖关系,你可以把这个依赖关系放出来,比如构造器的参数,类的属性等方法,让调用者实例化的时候,同时指定连接字符串。

    LinqToSql生成的DAL会自动生成多个构造器,你可以看看每一个的参数。

    一般来说Dal.dll需要的链接字符串还是来自应用的config文件里。比如web.config等。dll是没有config文件的。


    Facing problems, think first, then search, finally ask.
    2010年6月23日 8:40
    版主
  • 你可以把连接字符串复制一份到web.config 需要更多配置选择的话,你需要在在DAL和业务逻辑层都定义一个允许自定义连接字符串的接口。

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    2010年6月23日 17:37
    版主
  • 连接字符串在类库项目的app.config文件中,把那个拷到web.config中修改即可。
    Tech Blog: http://gildor.cnblogs.com
    2010年6月28日 13:16
  • 多谢! 问题解决了。我自己也试了一个新项目做了测试。发现可以起作用了。

    多谢大家热心帮助。

    2010年7月5日 2:52

全部回复

  • 其实这个可以理解为依赖关系,你可以把这个依赖关系放出来,比如构造器的参数,类的属性等方法,让调用者实例化的时候,同时指定连接字符串。

    LinqToSql生成的DAL会自动生成多个构造器,你可以看看每一个的参数。

    一般来说Dal.dll需要的链接字符串还是来自应用的config文件里。比如web.config等。dll是没有config文件的。


    Facing problems, think first, then search, finally ask.
    2010年6月23日 8:40
    版主
  • Linq的对象是含在Dal里面,而且Linq实体是自动拖表过来生成的,并不需要我的程序干涉,所以应该会有个配置的连接字串,只是不知道藏在哪里,怎么用。

    因为如果我不分层,直接将Linq放在页面层,系统会自动在Web.config里面添加连接串的。但是现在放在Dal层,就不知道如何配置了。

    请问版主,能否给个具体的例子,不太明白你说的方式。

    谢谢!

    2010年6月23日 10:03
  • 你可以把连接字符串复制一份到web.config 需要更多配置选择的话,你需要在在DAL和业务逻辑层都定义一个允许自定义连接字符串的接口。

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    2010年6月23日 17:37
    版主
  • 这么麻烦的吗?我还以为微软应该有缺省的文件配置的做法,不用自己去写才方便。而且Linq的对象都是自动生成的,不可能写在Linq里面。

    自动生成的Linq对象显然也编译了连接字串在里面了。

    2010年6月24日 4:29
  • 连接字符串在类库项目的app.config文件中,把那个拷到web.config中修改即可。
    Tech Blog: http://gildor.cnblogs.com
    2010年6月28日 13:16
  • 拷到web.config中是没用的,在三层的情况下,当发布完后的执行代码放在IIS的目录下时,Linq连接根本不会读取任何的web.config,你即使将web.config的连接字串删掉也不会影响到Linq取数据库的内容!

    还有哪位知道,请告知。。。。。。 等呀等!

    2010年6月29日 10:04
  • 网站引用的程序集所使用的Configuration File即为网站的web.config,这一点是毋庸置疑的,而检查Linq自动生成的代码可以看到,DataContext的默认构造函数使用的是Configuration File中指定的connection string:

     

    public TestDataContext() : 
    base(global::System.Configuration.ConfigurationManager .ConnectionStrings["TestConnectionString"].ConnectionString, mappingSource)
    {
    OnCreated();
    }

     

    因此修改web.config的connection string就可以了。事实上,我一直都是这么做的,而且都可以正常运行。

    如果您确定不能使用,是否可能是因为什么其他的原因,请检查一下。


    Tech Blog: http://gildor.cnblogs.com
    2010年6月29日 11:06
  • 我说的是分层结构,如果不分层,我也知道你这种方式是可以的,我也一直在用。

    关键是分层之后,它就写在了对应层的app.config 里面了。并不是web.config里面,楼上要自己试试。。。。。。

    2010年7月1日 9:19
  • 如果我没有试过的话是不会随便回答问题的,楼主要自己试试。。。。。。

    事实上,分层之后dll中会写入连接字符串的默认值,这也就是为什么调用方可以在不作设置的情况下正常使用默认连接。不过如果在调用者的web.config或者app.config中显式指定的话,则会覆盖默认设置。

    如果还有问题的话,欢迎提出。


    Tech Blog: http://gildor.cnblogs.com
    2010年7月3日 16:19
  • 楼上说的没错。

    只要给一个Class Library类型的项目添加Linq to SQL文件并添加数据表等,会在Properties文件夹下面生成一个Settings.settings文件,里面就会保存数据库连接,你还可以指定是否保存密码。

    在后续操作中,实例化DataContext时有多个重载的构造器,用无参的构造器的话会自动从Settings.settings里获取连接字符串的。

    提问和回答一个问题都不可能面面俱到,回答问题大多数时候只是解决表面现象,最重要的是提问者自己要通过回答的表面现象解决方案去思考。当然,还有基础知识必须要牢牢掌握,要不断地积累。


    Please mark the post answered your question as the answer, and vote other helpful posts, so they will appear differently to other users for the same problem. 请将解决实际问题的帖子标记为“答案”,并给其他有帮助的帖子投票,这样其他人有同样问题的时候可以快速找到解决方案。谢谢!
    2010年7月4日 1:05
    版主
  • 楼上,你好,无论如何先多谢。

    但是我试过在我发布的运行代码里面,无论我新增一个app.config,或者添加web.config里面的连接字串,它都是不起作用的,因为当时我是像你的想法一样,如果程序碰到有app.config 和 web.config 应该会自动去取的,但是没起作用。所以我才发出这个贴请求帮助的。

    如果你试过是可以的,能否跟我说的更明白一点,或者给我一个Sample来看看了,万分感激!

    2010年7月5日 2:13
  • 楼上你好,

    你说的“只要给一个Class Library类型的项目添加Linq to SQL文件并添加数据表等,会在Properties文件夹下面生成一个Settings.settings文件,里面就会保存数据库连接,你还可以指定是否保存密码。

    在后续操作中,实例化DataContext时有多个重载的构造器,用无参的构造器的话会自动从Settings.settings里获取连接字符串的。”

    我也知道,只是问题这个在开发环境下就一点也没有问题,但是一旦将代码发布成可运行的IIS发布代码,第一,app.config就消失了,第二,我改web.config的连接字串指向,也不起作用了。 所以我才发这个贴的。

    2010年7月5日 2:17
  • 好的,我明白了。您稍等。我写个demo先~
    Please mark the post answered your question as the answer, and vote other helpful posts, so they will appear differently to other users for the same problem. 请将解决实际问题的帖子标记为“答案”,并给其他有帮助的帖子投票,这样其他人有同样问题的时候可以快速找到解决方案。谢谢!
    2010年7月5日 2:19
    版主
  • 我新建了一个测试项目,请参考一下吧。

    平台是.NET Framework 3.5,工具是Visual Studio 2008和SQL Server Express 2008。

    我的步骤如下:

    1,在我的本地SQL Server Express 2008里创建一个库LayeredDemoDb,并创建一个表Employees,字段是EmpId(RowGUID,主键), EmpName(varchar(50)),EmpBirthDate(date),IsLocked(bit),CreationDate(datetime)。如果你已经有库可以跳过;

    2,在Visual Studio 2008里创建一个空白解决方案LayeredDemo;

    3,在LayeredDemo这个空白解决方案里添加一个Web应用程序项目Layered.Web;

    4,在LayeredDemo解决方案里添加一个类库项目Layered.Dal;

    5,给Layered.Dal项目里添加一个LINQ to SQL类Employees.dbml,从服务器资源浏览器里把Employees表拖到LINQ to SQL的设计器里。这时会自动添加Settings.settings和app.config到Layered.Dal项目;

    6,给Layered.Web添加Layered.Dal的引用和System.Data.Linq的引用;

    7,在Default.aspx里添加一个GridView;

    8,在Default.aspx.cs里给GridView设置数据。

    9,F5。

    我上传到SkyDrive了,可以参考一下。文件地址:http://cid-49b31ff55052b733.office.live.com/self.aspx/Public/LayeredDemo.zip

    希望对楼主有帮助:)


    Please mark the post answered your question as the answer, and vote other helpful posts, so they will appear differently to other users for the same problem. 请将解决实际问题的帖子标记为“答案”,并给其他有帮助的帖子投票,这样其他人有同样问题的时候可以快速找到解决方案。谢谢!
    2010年7月5日 2:47
    版主
  • 多谢! 问题解决了。我自己也试了一个新项目做了测试。发现可以起作用了。

    多谢大家热心帮助。

    2010年7月5日 2:52
  • 多谢你的提示。我新建了一个Sample项目,发现你的方法是可以行得通。有可能当时原来的项目有些问题。或有些问题我不够细心。没发现到。

    无论如何。谢谢了。

    2010年7月5日 2:55
  • 嗯,很好。:)

    有些问题是比较奇怪,本身难以被发现。


    Please mark the post answered your question as the answer, and vote other helpful posts, so they will appear differently to other users for the same problem. 请将解决实际问题的帖子标记为“答案”,并给其他有帮助的帖子投票,这样其他人有同样问题的时候可以快速找到解决方案。谢谢!
    2010年7月5日 3:05
    版主