【问题标题】:How can we assume a bool Property on a Generic<T> class , where T is a auto generated LINQ2SQL class我们如何在 Generic<T> 类上假设一个 bool 属性,其中 T 是自动生成的 LINQ2SQL 类
【发布时间】:2009-11-14 20:23:09
【问题描述】:

我正在我的 WPF 应用程序中对数据库生成的类(使用 LINQ2SQL)进行 CRUD 操作。我所有的数据库表都存在 IsDelete 属性。所以我想定义一个抽象/接口类来执行 SoftDelete()。我的问题是,如何以访问 T.IsDelete = true 的方式定义我的 Generic 类?或者在代码中我想做类似下面的事情

public abstract class CRUDOperations <T> : where T is????
{
  .......
  protected virtual SoftDelete()
  {
     T.IsDeleted = true;
  }
}

哪里 T 是由 LINQ To SQL (DBML) 生成的 DB 表类,我不能在它上面强加一个接口或基类?或者在 DB 中是否有一种技术可以拥有一个具有与 C# 相同的 Base/Derive 概念的基表

【问题讨论】:

    标签: c# wpf linq linq-to-sql generics


    【解决方案1】:

    1) 定义 ISoftDelete

    public interface ISoftDelete
    {
      bool IsDeleted { get; set; }
    }
    

    2) 为所有实体创建部分类

    public partial class MyLinqEntity : ISoftDelete { }
    public partial class MyOtherLinqEntity : ISoftDelete { }
    public partial class MyFurtherLinqEntity : ISoftDelete { }
    

    3) 将您的接口添加到泛型类型限制

    public abstract class CRUDOperations <T> : where T is ISoftDelete
    

    【讨论】:

    • 谢谢,看起来像一个解决方案,但 Step2 对我所有的表类来说都是一项巨大的工作吗?
    • 是的。在设计器中还有其他方法可以做到这一点,但我更喜欢这种方法,因为我将拥有所有可以用来修改我的实体的部分。此外,如果我不得不放弃 DBML 并重新开始(发生的次数超出了我的预期),我将不必重做所有自定义工作。
    • IIRC,您不能在设计器中执行此操作 - 您必须手动编辑 dbml。
    【解决方案2】:

    你可以在接口上声明这个:

    public interface ICanDelete {
        bool IsDeleted {get;set;}
    }
    

    让隐式接口实现发挥它的魔力。那么问题就变成了:“如何让它知道我的实体实现了这个接口?”。两种选择:

    • 为每个实体添加一个部分类(在不同的文件中):

      partial class Customer : ICanDelete {}
      partial class Order : ICanDelete {}
      
    • 编辑 dbml 以将此接口指定为基类:

      <Database EntityBase="Some.NameSpace.ICanDelete" ... >
      

      (这使得 LINQ-to-SQL 的代码生成为您添加了: Some.NameSpace.ICanDelete

    那么就在泛型子句中使用这个接口:

    where T : ICanDelete
    

    【讨论】:

      【解决方案3】:

      数据库生成的类不是从实体派生的吗?

      【讨论】:

      • 这是我可以看到的 MyTableClass: INotifyPropertyChanging, INotifyPropertyChanged
      • 听起来像 EF;问题是 LINQ-to-SQL
      猜你喜欢
      • 2015-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-19
      • 1970-01-01
      • 2021-08-26
      相关资源
      最近更新 更多