0

LinqToSql で 2 つのサブクラスを持つベース クラスを作成しました。サブクラスのカスタム更新メソッドのそれぞれに異なるストアド プロシージャを割り当てる必要があります。これで問題ありませんが、「無効なオブジェクト名 'xxx'」というエラーが表示されます。

例えば

DataClasses1DataContext dc = new DataClasses1DataContext();
Class2 c2 = new Class2() { ID = 1, Name = "test", Type = "s" };
dc.Class1s.InsertOnSubmit(c2);
dc.SubmitChanges();

...Class2はClass1を継承し、Class2には独自のカスタムINSERTメソッドがあります(これを実行したいです)。

ありがとう。

解決策:ブライアンの答えは、私が求めていたものを私に与えてくれました。デザイナーの背後にあるクラスに追加したコードは次のとおりです。

partial class DataClasses1DataContext
{
    partial void InsertClass1(Class1 instance)
    {
        instance.Insert(this);
    }
}

partial class Class1
{
    public abstract void Insert(DataClasses1DataContext dataContext);
}

partial class Class2
{
    public override void Insert(DataClasses1DataContext dataContext)
    {
        dataContext.InsertSP(((System.Nullable<int>)(ID)), Name);
    }

}

partial class Class3
{
    public override void Insert(DataClasses1DataContext dataContext)
    {
        dataContext.InsertSP2((System.Nullable<int>)(ID), Name);
    }
}

InsertSP および InsertSP2 ストアド プロシージャは、sp を手動で呼び出す手間を省くために、デザイナーを使用してドラッグされました。

これについてはブライアンのすべての功績

4

1 に答える 1

2

これが LINQ to SQL デザイナーによって生成されるものである場合:

partial void InsertClass1(Class1 instance);

クラスに実装がありますpartial

partial void InsertClass1(Class1 instance)
{
    ...call stored procedure...
}

Class1代わりに、その操作を表す仮想メソッドを使用できます。

protected virtual void Insert(Class1 instance)
{
    ...call stored procedure...
}

Class1partialメソッドから呼び出します。

partial void InsertClass1(Class1 instance)
{
    Insert(instance);
}

そしてそれをオーバーライドしますClass2

protected override void Insert(Class1 instance)
{
    ...call different stored procedure...
}

唯一の問題は、オーバーライドされたメソッドにキャストする必要があることですがClass2、常に成功します。

于 2009-07-21T21:25:45.447 に答える