I have grown very found of using LINQ in my applications. Everything with LINQ was working great until I wanted to use it with a SQL Server Compact database. I created a .sdf database with all my tables, all was well until I tried dragging objects from the server explorer to the .dbml designer. Then I hit this:
Picture
Well what now? "The selected object(s) use an unsupported data provider" - does this mean you can't even use LINQ with a compact database? No, calm your fears. It only means that the designer does not support graphically creating the dbml. LINQ supports a huge array of data sources, some of which are not supported by the designer. 

So we just get the fun of creating our object mapping at the command line! Yeah! Really, in all seriousness, it is not that bad. The following is performed with Visual Studio 2010 in Visual Basic, but should work with other languages and versions. Here are the steps:
  1. We are going to be using SqlMetal.exe to create the object map. So go to the Visual Studio Command prompt. This can be accessed by going to the Microsoft Visual Studio 2010 folder in the start menu, then Visual Studio Tools > Visual Studio Command Prompt.
  2. Now type in the command. This will be:

    SqlMetal.exe "C:\DatabasePath\theDatabase.sdf" /dbml:"C:\DatabasePath\theDatabase.dbml"

    Hit enter and execute the command. This will create the .dbml file in the specified location.
    Note: You will obviously want to substitute the file paths for your own paths, this will often be a path to the folder where the Visual Studio project is stored. 
  3. Now go back to your project in Visual Studio. Go to the Project menu and select "Add Existing Item.." (Ctrl+D). Now select the .dbml file that was just created, and add it to the project. 
  4. Your about set, you now have a class in you project that represents your database schema. However, one addition step must be performed when using LINQ with the class.

    Normally with LINQ you can just specify a new data source as follows:

Dim theData As New theDatabase

When you create a .dbml with SqlMetal it does not have the data connection saved with the .dbml like it does when you create it with the designer. So you need to supply the connection string when creating a new instance of the object:

Dim theData As New Vocabulary("Data Source=|DataDirectory|\theDatabase.sdf")

Have a great day! You should now be back up and running with LINQ.