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...
}

Class1并从的方法中调用它partial

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 回答