6

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 ファイルを手動で追加してもうまくいきません。

4

3 に答える 3

3

簡単に言えば、SQLMetal はパラメーターなしのコンストラクターを実行しないということです。残りの答えは、部分クラスが機能するはずですが、次のようになります。

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

興味がある点:


  • 必要に応じて OnCreated イベントを正しく接続できるように、base の代わりに this(string) コンストラクターを呼び出します。
  • 必要に応じて接続文字列を取得します-簡単な方法は次のとおりです

    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>
于 2011-11-02T13:41:24.617 に答える
0

部分クラスを使用してパラメーターなしのコンストラクターを作成します (あなたと同じように)。問題はありません。

名前空間で を作成DataDataContextしていることに注意してください。DAL(上記のコードにはありません)

namespace DAL {
    public partial class DataDataContext
    {
        public DataDataContext() :
            base(global::DAL.Properties.Settings.Default.MyConnectionString, mappingSource)
        {
            OnCreated();
        }
    }
 }
于 2011-04-09T15:58:33.387 に答える
0

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()); 
于 2011-11-02T13:03:15.110 に答える