Как настроить пользовательские методы вставки / обновления / удаления для унаследованных вложенных процедур в LinqToSql? - PullRequest
0 голосов
/ 21 июля 2009

Я создал класс баса в 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.

ВСЕ КРЕДИТ БРИАНУ НА ЭТО ОДИН

1 Ответ

2 голосов
/ 22 июля 2009

Если это то, что генерируется конструктором 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...
}

и вызовите его из Class1 partial метода:

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

и переопределить его в Class2:

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

Единственный улов в том, что вам придется привести к Class2 в переопределенном методе, но это всегда будет успешным.

...