Универсальный класс LINQ to SQL для операций вставки и удаления - PullRequest
0 голосов
/ 27 ноября 2009

Я пишу один и тот же код для вставки, обновления, удаления с помощью LINQ снова и снова. Я хочу иметь какую-то общую функцию для операций вставки, обновления, удаления. Я прочитал сообщение здесь , например:

    public static void Insert<T>(T entity) where T : class
{
   using (OrcasDB database = new OrcasDB())
   {
      database.GetTable<T>().Add(entity);
      database.SubmitChanges();
   }
}

public static void Delete<T>(Expression<Func<T, bool>> predicate)
where T : class
{
   using (OrcasDB database = new OrcasDB())
   {
      T instance = (T) database.GetTable<T>().Where<T>(predicate).Single();
      database.GetTable<T>().Remove(instance);
      database.SubmitChanges();
   }
}

How to Use
// insert
Employee will = new Employee
{
   Username = "will.asrari",
   EmailAddress = "me@willasrari.com",
   CanCode = true
};

LinqHelper.Insert<Employee>(will); 

// delete
LinqHelper.Delete(emp => emp.EmployeeId.Equals(3));

Да, я хотел бы написать что-то вроде VB.NET. Хорошо ли следовать приведенному выше коду? Может кто-нибудь показать мне какой-нибудь универсальный класс LINQ to SQL для вставки, удаления, обновления, написанный на VB.NET?

Спасибо.

Ответы [ 2 ]

1 голос
/ 29 ноября 2009

К вашему сведению, мне удалось написать простой класс для выполнения общей операции CUD для LINQ to SQL.

'Class GenericCUD.vb

Импорт System.Linq.Expressions Импортирует System.Data.Linq

Открытый класс GenericCUD

Public Shared Sub Insert(Of T As Class)(ByVal theEntity As T)
    Using db As New DemoDataContext()
        db.GetTable(Of T)().InsertOnSubmit(theEntity)
        db.SubmitChanges()
    End Using
End Sub


Public Shared Sub Update(Of T As Class)(ByVal originalEntity As T, ByVal newEntity As T)
    Using db As New DemoDataContext()
        db.GetTable(Of T)().Attach(newEntity, originalEntity)
        db.Refresh(RefreshMode.KeepCurrentValues, newEntity)
        db.SubmitChanges()
    End Using
End Sub

Public Shared Sub Delete(Of T As Class)(ByVal theEntity As T)
    Using db As New DemoDataContext()
        db.GetTable(Of T)().Attach(theEntity)
        db.GetTable(Of T).DeleteOnSubmit(theEntity)
        db.Refresh(RefreshMode.KeepCurrentValues, theEntity)
        db.SubmitChanges()
    End Using
End Sub

Конечный класс

Как пользоваться классом:

   'Using Insert
    Dim ta As New TestAuthor
    ta.FirstName = TextBox1.Text
    ta.LastName = TextBox2.Text
    GenericCUD.Insert(ta)


   'Using Update
    Dim original As New TestAuthor
    original.Id = 3


    Dim newEntity As New TestAuthor
    newEntity.Id = original.Id
    newEntity.FirstName = TextBox1.Text
    newEntity.LastName = TextBox2.Text

    GenericCUD.Update(original, newEntity)


   'Using Delete
    Dim ta As New TestAuthor
    ta.Id = 7
    GenericCUD.Delete(ta)

Я прочитал много постов во многих блогах. Вот некоторые из них, которые действительно помогли мне заставить работать GenericCUD:

  1. LINQ, Lambda и Generics: вставить и удалить
  2. LINQ to SQL CRUD
  3. Как заставить LINQ to SQL проверять наличие изменений после присоединения

Итак, что вы думаете о классе GernericCUD выше? Пожалуйста, дайте мне комментарий, потому что я хочу улучшить его. Спасибо.

0 голосов
/ 27 ноября 2009

Мы применили аналогичный подход в нашей трехуровневой среде приложений. В настоящее время у нас имеется около 80 сущностей, и мы использовали дженерики для создания очень легкого набора универсальных методов CRUD, которые защищают эти 80 сущностей и любое количество сущностей.

Единственное, что я могу сделать, это переосмыслить ваш подход к созданию нового контекста базы данных для каждой операции вставки, обновления и удаления. Проблема в том, что если вам нужно обернуть несколько вставок, обновлений и / или удалений в одну транзакцию, вам нужно будет использовать объект TransactionScope, потому что каждая вставка / обновление / удаление использует свой собственный объект контекста. Использование TransactionScope - это нормально, но, поскольку у вас есть несколько соединений, транзакция будет преобразована в транзакцию MTC, что создает трудности.

Не могу помочь вам с кодом VB. ИМО, учись и придерживайся C #.

Randy

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