tags:

views:

32

answers:

2

Hi

When I try to update table using following code I get error message

"Cannot create an instance of the variable type 'T' because it does not have the new() constraint"

How Can I create a new instance and update data in database.

   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; }
}

Extension Method

 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: I know the another way but I want to update table using extension method

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

Thanks

+3  A: 

Have you tried adding a new constraint?

where T : class, new()
Mark Byers
+3  A: 

Add the constraint where T : new():

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

Note that T can not be abstract, and the new constraint must be the last constraint listed.

Whoa, just noticed this:

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

You can not get away this unless you add a constraint to T so that the compiler knows that T has properties named bName and aName. At a minimum you need to specify

where T : BookData, new()

where BookData is a class that has those properties defined. This will specify that T is BookData or derives from BookData and that it has a public parameterless constructor. In this case you can do away with the constraint where T : class. Alternatively you can specify

where T : IBookData, new()

where IBookData is an interface defining the two properties that you are using. This constraint specifies that T is a type that implements IBookData and that it has a public parameterless constructor.

Given that, I don't understand why you are doing this generically.

Jason
Hi Jason I thought may be I use extension to method to solve my question which I ask before(still waiting for answer) http://stackoverflow.com/questions/2045601/update-table-using-linq-to-sql
NETQuestion