CRUD (database layer) for F# with TypeProviders
new() = new Item()


This is infinite recursion, in order to call the parameterless constructor, you call the parameterless constructor. It's not quite clear to me what the default values of id and name should be. In C#, it might be okay to use null, but that's not the common approach in F#.



query {
    for row in db.ItemsTable do
    select row
}


Wouldn't just db.ItemsTable work here too?



query {
    for rows in db.ItemsTable do
    where (rows.ItemId = itemId)
    select rows
} 
|&gt; (fun s -&gt;
        if Seq.isEmpty s then
            None
        else
            s |&gt; Seq.head |&gt; this.Record2Item |&gt; Some)


That second part could be simplified to:

|&gt; Seq.tryPick Some
|&gt; Option.map this.Record2Item




try
    db.DataContext.SubmitChanges()
with
    | exn -&gt; printfn "Exception: \n%s" exn.Message


Are you sure that it's okay for your DB layer to just print any errors to the console and then continue as if everything was fine? That doesn't sound like a very robust approach to me.

If you're sure you want to do it this way, then consider extracting this code into a separate function, since you're repeating it at several places.



|&gt; (fun e -&gt; e.ItemName &lt;- item.ItemName)


I personally don't like this style of code. Pipelining using |&gt; should be used for code that doesn't mutate anything.



if Option.isSome item then
    (Option.get item).ItemName |&gt; should equal "two"


I would probably use pattern matching here.