如何在Linq To Sql中为继承的子类设置自定义插入/更新/删除方法?

时间:2009-07-21 17:24:58

标签: c# linq linq-to-sql datacontext

我在LinqToSql中创建了一个有2个子类的低音类。我需要为每个子类自定义更新方法分配不同的存储过程。这样做很好,但是我收到“无效对象名称'xxx'”的错误。

e.g。

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 个答案:

答案 0 :(得分: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的{​​{1}}方法调用它:

partial

并在partial void InsertClass1(Class1 instance) { Insert(instance); } 中覆盖它:

Class2

唯一的问题是你必须在重写方法中强制转换为protected override void Insert(Class1 instance) { ...call different stored procedure... } ,但它总会成功。