【问题标题】:LINQ to SQL deployment problemLINQ to SQL 部署问题
【发布时间】:2023-04-02 00:59:01
【问题描述】:

我开发了一个 asp.net 应用程序。它使用 LINQ to SQL 访问数据库,使用 Visual Studio 2008 中的 .dbml 设计器。我们正在客户端上安装应用程序,他们决定更改服务器上的数据库名称。现在,应用程序无法运行,因为 LINQ 找不到数据库信息。这不是连接字符串的问题,而是 .dmbl 设计器生成的文件的问题。我想我们有一些选择: 1.更改开发数据库名称以匹配客户端名称,重新生成de dbml,重新编译,再次将应用程序发送给客户端。 2. 在客户端安装VS2008并进行必要的修改。

似乎没有一个选项真的很好。这不是世界末日,而是真正的痛苦。希望有更合理的解决方案!有什么想法吗?


更新
在您的答案的帮助下进一步研究了这个问题之后,我认为问题出在模式上。总而言之,数据库有一个新名称和一个新模式。我想 sqlmetal.exe 选项是目前最好的选项。无论如何,如果是这样的话,我仍然认为这是一个真正的痛苦。

【问题讨论】:

    标签: .net asp.net linq linq-to-sql deployment


    【解决方案1】:

    我会说是连接字符串的问题,看生成的类:

        public SomeDataContext() : 
            base(global::System.Configuration.ConfigurationManager
    .ConnectionStrings["someConnectionStringKey"].ConnectionString, mappingSource)
    

    请提供更多信息。也许您的意思是架构更改,在这种情况下,我强烈建议在开发环境中进行相同的更改。

    更新 1: 生成的类上的 DatabaseAttribute 可能让您感到困惑。

    使用 Name 属性 要指定的 DatabaseAttribute 属性 当名称 为时的数据库名称 不是由连接提供的

    来源:http://msdn.microsoft.com/en-us/library/bb399355.aspx# (enpashis by me)

    只需在连接字符串中指定数据库即可。

    更新2:如果你生成的类由于某种原因没有上面的代码(并且你没有在参数中明确指定一个),在设计器上打开它,打开属性,并确保它在 Connection 属性中进行了配置,并将 Applications Settings 设置为 true。

    【讨论】:

      【解决方案2】:

      作为 VS2008 类 SQLMetal.exe 的一部分有一个 exe,它执行生成 DataContext.cs 文件的重要部分。我认为您所要做的就是更改 DBML 文件(它是一个简单的 XML 文件),运行 SQLMetal(生成 .CS),然后运行 ​​csc.exe(.NET 框架的一部分)来生成一个程序集(如果您将 DataContext 单独放在程序集中会更容易)。这基本上归结为选项 2,但需要安装的文件要少得多。


      更新:重新阅读您的问题,我意识到改变的不是表名,而是 数据库 名。这是一个不同的问题(尽管上述解决方案也适用)。

      当 VS2008 从 .dbml 文件生成 DataContext 类时,它会创建两个构造函数:一个不带参数,另一个带一个字符串(加上几个 ctor,我们可以忽略)。

      零参数 ctor 使用您在创建 dbml 时使用的连接字符串,然后将其嵌入到资源文件中。这是一个难以置信愚蠢的设计,真的应该只用于概念验证代码和演示。

      所有真正的生产代码都应该使用带有字符串的ctor——特别是连接字符串——你应该从app.config文件中读出它。

      这当然意味着“正确”的解决方案是选项#1——在你的办公室重写代码并重新部署。这很麻烦,但从长远来看,这是最好的。

      【讨论】:

      • @james:这其实是错误的,linq2sql 确实支持使用连接字符串,看我的回答
      • 嗯.. 哪里出了问题?我说它可以使用连接字符串。 (倒数第二段)
      • 我正在查看代码,并使用带有连接参数的构造函数实例化了该类。无论如何,我会继续研究这个问题。感谢您的回答!
      【解决方案3】:

      操作:

      我很惊讶这会导致问题。我使用 Linq to SQL 开发了大约 5 个附加组件。为了避免这种情况,我唯一要做的就是执行以下操作:

      使用 (NamedDataContext ctx = new NamedDataContext("{从配置文件/注册表项/等插入连接字符串}")) {

      ...要针对数据库执行的代码...

      }

      目前还没有遇到任何问题。我很困惑为什么您的应用程序没有配置方法来处理配置数据库连接,因为这通常是大多数应用程序需要内置到它们中的第一件事。

      【讨论】:

      • @richard,我做了类似的事情,但只是因为它特别需要从不同的地方获取连接字符串......我在部分类中使用了静态属性,所以我的代码使用了 MyDataContext。默认。对此使用 linq 支持会更快,请参阅我的回答。
      • Freddy:我看到了,但我一定是看错了 OP 的信息……他的架构完全改变了……所以不管他怎么做,它都会崩溃……这样总体而言,是有发展的生活,超出了这里任何人所说的范围。
      【解决方案4】:

      我个人会告诉客户,从开发的数据库名称更改数据库名称将花费他们 XX 美元的新开发成本,然后看着他们立即更改名称。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多