代码之家  ›  专栏  ›  技术社区  ›  HAdes

如何在LinqToSql中设置自定义Insert/Update/Delete方法以继承子类?

  •  0
  • HAdes  · 技术社区  · 17 年前

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

    例如

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

    解决方案

    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存储的proc,为我省去了手动调用sp的麻烦。

    1 回复  |  直到 17 年前
        1
  •  2
  •   Bryan Watts    17 年前

    如果这是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...
    }
    

    并从 一级 s 部分的 方法:

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

    并在中覆盖它 Class2 :

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

    唯一的问题是,你必须投 班级2 在重写的方法中,它总是成功的。