2011-03-13 65 views
6

我需要定期刷新我的Linq To SQL类;是的,让我感到羞愧的是没有充分考虑我的数据模式,糟糕的开发人员和广告恶心。我发现SQLMetal几乎可以做到这一点,但也许我从参数列表中遗漏了一些东西。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文件。

+0

新增赏金。我已经使用了OP设计没有问题,但与SQL精简工作,并通过SQLMetal去,我想我们很多人想知道如何生成一个无参数的构造函数。 – aevanko 2011-10-27 08:17:50

回答

0

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

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

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

1)你真的需要.dbml文件吗?也许你可以产生直接的是这样必要的ORM文件(并将其纳入到您的解决方案):

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

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

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

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

简短的回答是,SQLMetal不做参数构造函数。答案的其余部分是你的部分类应该工作,但它应该是这样的:

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

问题的兴趣:

  • 调用这个(String)构造,而不是底座,使得
    如果您选择,可以正确连接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> 
+0

感谢的人,这是我所需要的,他知道如何设置SQLMetal,只是需要一个覆盖构造函数来获取连接串出的应用程序/ web.config文件中把它在构造函数中的全部时间代替。 – Pierre 2013-06-05 16:21:40