Обновление таблицы с использованием Linq и метода расширения - PullRequest
0 голосов
/ 14 января 2010

Когда я пытаюсь обновить таблицу, используя следующий код, я получаю сообщение об ошибке

"Невозможно создать экземпляр типа переменной 'T', поскольку у него нет ограничения new ()"

Как я могу создать новый экземпляр и обновить данные в базе данных.

   IEnumerable<BookData> bookData = GetBookData(...);

   BookDataContext bookDB = new BookDataContext ();

   bookDB.UpdateTable<MCDB.BookTable>(bookDB.BookTable,bookData);



class BookTable
{
    public string bookName { get; set; }
    public string  authorName { get; set; }
}

Метод расширения

 public static void UpdateTable<T>(this DataContext context, Table<T> tbl, IEnumerable<BookData> data)
    where T : class
    {
        foreach (var item in data)
        {
            context.GetTable<T>().InsertOnSubmit(new T());
            // Error in above statement 

             // I want to do something like this
             context.GetTable<T>().InsertOnSubmit(new T
                {
                    bName = item.bookName
                    aName = item.authorName,
                });
         }
         context.SubmitChanges();
    }

PS: я знаю другой способ, но я хочу обновить таблицу, используя метод расширения

using ( BookDataContext bookDB = new BookDataContext ())
{
  //code 
}

Спасибо

Ответы [ 2 ]

3 голосов
/ 14 января 2010

Добавить ограничение where T : new():

public static void UpdateTable<T>(
    this DataContext context, Table<T> tbl,
    IEnumerable<BookData> data
) where T : class, new() {
    // details
}

Обратите внимание, что T не может быть абстрактным, и ограничение new должно быть последним в списке.

Ого, только что заметил это:

context.GetTable<T>().InsertOnSubmit(new T
    {
        bName = item.bookName
        aName = item.authorName,
    }
);

Этого нельзя избежать, если вы не добавите ограничение к T, чтобы компилятор знал, что T имеет свойства с именами bName и aName. Как минимум, вам нужно указать

where T : BookData, new()

где BookData - это класс, для которого определены эти свойства. Это будет указывать, что T равен BookData или является производным от BookData и что он имеет открытый конструктор без параметров. В этом случае вы можете избавиться от ограничения where T : class. В качестве альтернативы вы можете указать

where T : IBookData, new()

где IBookData - интерфейс, определяющий два используемых вами свойства. Это ограничение указывает, что T является типом, который реализует IBookData, и что он имеет открытый конструктор без параметров.

Учитывая это, я не понимаю, почему вы делаете это в общем.

3 голосов
/ 14 января 2010

Вы пытались добавить новое ограничение ?

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