1

submitchanges() メソッドが起動する前に、linq によって生成された TSQL をインターセプトすることは可能ですか? SQL挿入クエリを変更する必要があります。

4

2 に答える 2

2

SQL 自体を変更することはできませんが、挿入プロセスを傍受することはできます。生成されたデータ コンテキストには、メソッドの部分的な実装がInsertスタブ化されている必要があります。たとえば、エンティティの名前が の場合MyDbEntity:

partial void InsertMyDbEntity(MyDbEntity instance);

これは部分的なものであるため、生成されたデータ コンテキストの周りに作成した部分クラスで変更できます。次に、このフックを使用して、クロス全体から INSERT ステートメントを生成するか、作成したカスタム ストアド プロシージャを呼び出して、達成しようとしているニュアンスを処理することができます。

これが最善の方法です。途中で既存の INSERT SQL をインストルメント化することはできません。

于 2012-06-08T14:02:04.607 に答える
0

Yup, it is possible to intercept the SubmitChanges() call, but not the SQL itself.

In my application, my .dbml file is called "GlobalPricing.dbml", and I have created a class called GlobalPricingDataContext.cs.

public partial class GlobalPricingDataContext: System.Data.Linq.DataContext
{
    public override void SubmitChanges(ConflictMode failureMode)
    {
        int inserts = base.GetChangeSet().Inserts.Count;
        int updates = base.GetChangeSet().Updates.Count;
        int deletes = base.GetChangeSet().Deletes.Count;

        Trace.WriteLine(string.Format("{0}  There are {1} inserts, {2} updates and {3} deletes.", DateTime.Now.ToLongTimeString(), inserts, updates, deletes)); 

        base.SubmitChanges(failureMode);
    }
}

Again, this code won't let you modify the SQL which gets run, but it will at least let you know about what inserts, updates and deletes each of the SubmitChanges() calls is attempting to do.

于 2016-12-21T14:04:03.443 に答える