【问题标题】:SQLMetal generates classes but not parameterless constructorsSQLMetal 生成类但不生成无参数构造函数
【发布时间】:2011-03-13 19:42:11
【问题描述】:

我需要定期刷新我的 Linq To SQL 类;是的,我为没有充分考虑我的数据模式而感到羞耻,糟糕的开发人员,令人作呕。我发现 SQLMetal 几乎可以解决问题,但也许我在参数列表中遗漏了一些东西。

当我使用 Visual Studio 外部工具从闪亮的新工具栏按钮运行批处理文件时,

@echo off
del c:\path\to\LinqToSql.dbml
SQLMetal.exe /server:SERVER\SQLSERVER /database:db /timeout:0 /dbml:"c:\path\to\LinqToSql.dbml" /namespace:DAL /context:DataDataContext /entitybase:System.Data.Linq.DataContext /language:csharp /pluralize

SqlMetal 生成 .dbml 文件,万岁。但是,问题 1 我可以以编程方式将 .dbml 文件包含到我的项目中吗?

问题 2

为什么,当我在手动包含新生成的 .dbml 文件后进行编译时,我的每个类是否都有以下与其无参数构造函数的行号相关的构建错误?例如30 个表 = 30 个构建错误。

'System.Data.Linq.DataContext' does not contain a constructor that takes 0 arguments

实际

我确实注意到我的DataDataContext 生成的类没有无参数构造函数,所以我添加了一个部分类来补充,但它仍然不能解决问题。

public partial class DataDataContext
{
    public DataDataContext() :
        base(global::DAL.Properties.Settings.Default.MyConnectionString, mappingSource)
    {
        OnCreated();
    }
}

我认为这个刷新过程可以自动化,但手动添加生成的 .dbml 文件会产生这些构造函数错误,这对我不起作用。

【问题讨论】:

  • 增加了赏金。我使用 OP Designer 没有问题,但使用 SQL Compact 并通过 SQLMetal,我想我们中的许多人都想知道如何生成无参数构造函数。

标签: c# .net linq-to-sql connection-string sqlmetal


【解决方案1】:

简短的回答是 SQLMetal 不执行无参数构造函数。剩下的答案是你的部分类应该可以工作,但它应该看起来像这样:

namespace DAL {
    public partial class DataDataContext
    {
        public DataDataContext() :
            this(/* Get your connection string here */)
        {
            OnCreated();
        }
    }
 }

兴趣点:

  • 调用 this(string) 构造函数而不是 base 以便
    如果您愿意,可以正确连接 OnCreated 事件。
  • 根据需要获取连接字符串 - 一种简单的方法是

    ConfigurationManager.ConnectionStrings["MyConnectionSTring"].ConnectionString

结合app.config中的以下内容:

<connectionStrings>
    <add
        name="MyConnectionSTring"
        connectionString="Data Source=SQLServerName\instance;Initial Catalog=DatabaseName;Persist Security Info=True;User ID=user"
        providerName="System.Data.SqlClient" /> 
</connectionStrings>

【讨论】:

  • 谢谢,这就是我所需要的,知道如何设置 SQLMetal,只需要一个覆盖构造函数来从 app/web.config 中获取连接字符串,而不是将其放入构造函数中整个时间。
【解决方案2】:

我使用部分类来创建无参数构造函数(和你一样)并且没有任何问题。

请注意,您正在 DAL 命名空间中创建 DataDataContext。 (上面的代码中缺少)

namespace DAL {
    public partial class DataDataContext
    {
        public DataDataContext() :
            base(global::DAL.Properties.Settings.Default.MyConnectionString, mappingSource)
        {
            OnCreated();
        }
    }
 }

【讨论】:

    【解决方案3】:

    1) 你真的需要 .dbml 文件吗?也许您可以使用类似这样的东西直接生成必要的 ORM 文件(并将其包含在您的解决方案中):

    SQLMetal.exe /server:SERVER\SQLSERVER /database:DB /namespace:DAL /code:YourDatamapClass.cs /language:csharp
    

    然后让批处理文件将现在刷新的类移动到正确的位置(可能是解决方案文件夹)。

    2) 你真的需要一个无参数的构造函数吗?例如,将 DB 连接字符串放入您的配置文件并使用它创建映射器对象:

    //GetConnectionString (not included here) gets the connection string from config
    DB context = new DB(GetConnectionString()); 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-10
      • 2017-03-17
      • 1970-01-01
      相关资源
      最近更新 更多