Как мы можем принять свойство bool для общего <T>класса, где T - автоматически сгенерированный класс LINQ2SQL - PullRequest
2 голосов
/ 14 ноября 2009

Я выполняю операцию CRUD для класса, сгенерированного базой данных (используя LINQ2SQL) в моем приложении WPF. Все мои таблицы БД имеют свойство IsDelete, которое существует. Поэтому я хочу определить абстрактный / интерфейсный класс для SoftDelete (). Мой вопрос здесь, как я могу определить мой универсальный класс таким образом, чтобы получить доступ к T.IsDelete = true? или в коде я хочу сделать что-то вроде ниже

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

Где T - это сгенерированные БД Табличные классы с помощью LINQ To SQL (DBML), которые я не могу наложить поверх этого интерфейса или базового класса? Или есть метод в БД, чтобы иметь базовую таблицу, которая имеет те же концепции базовых / производных C #

Ответы [ 3 ]

3 голосов
/ 14 ноября 2009

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
2 голосов
/ 14 ноября 2009

Вы можете объявить это на интерфейсе:

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
0 голосов
/ 14 ноября 2009

Разве базы данных не созданы классами, производными от Entity?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...