Monday, April 14, 2008

In April 2008 issue of MSDN Magazine (April is not online yet, but in your mailbox), I wrote an {End Bracket} essay about Surface Computing, Microsoft's "Vision Quests" and CSI (yes, the T.V. show). A few weeks after the essay was finalized and headed to the printer, I turned on CSI and wouldncha know it, there was a Surface computer!

Update: Here's a link to the essay: The Magic of Software.

Monday, April 14, 2008 12:31:27 PM (Eastern Standard Time, UTC-05:00)  #     |  Comments [1]  | 
 Saturday, April 12, 2008

Between the many conversations I had with folks over the days about thinking, about Presentation Zen, about languages and about ALT.NET, I leave Sweden with my head filled with new ideas which I'm very excited about. Read more here...

[A DevLife Post]

Saturday, April 12, 2008 4:00:45 PM (Eastern Standard Time, UTC-05:00)  #     |  Comments [0]  | 
 Thursday, April 10, 2008

These things tend to happen when I'm travelling and don't check my feeds for an entire day. I can't say this is a huge surprise since it's very sensible. I'm happy to finally have some tangible news from the team. I'll be happy to share this news in my Entity Framework workshop tomorrow! During the conference I actually had someone suggest that they still didn't believe that EF wouldn't go the way of Object Spaces. Sheesh!

Entity Framework & ADO.NET Data Services to Ship with VS 2008 SP1 & .NET 3.5 SP1

Wednesday, April 09, 2008, 7:02:00 PM | dpblogsGo to full article

It's settled! The Entity Framework (and the Entity Designer) along with ADO.NET Data Services will RTM as part of the Visual Studio 2008 and .NET 3.5 SP1 releases!

Unfortunately, we don't have official release dates at this point, but stay tuned. You'll also want to keep an eye out for the upcoming SP1 Beta 1, which will be your next chance to check out updated bits for both of these products.

Elisa Flasko
Program Manager, Data Programmability

Thursday, April 10, 2008 6:15:00 PM (Eastern Standard Time, UTC-05:00)  #     |  Comments [2]  | 

Just had to share this funny comment that came through my other blog. Not as a comment on a post but from the contact form.

"hi dear kese hoooooo i learn C# but i can't understand what should i do please tell me "

Thursday, April 10, 2008 11:31:29 AM (Eastern Standard Time, UTC-05:00)  #     |  Comments [2]  | 

Doug Seven is one of the track chairs for the track that I'm speaking in at TechEd Developer. I was talking to him the other day about finding the line between the "Presentation Zen" type of presentation (where an extreme example would be a slide with nothing more than a smiley face on it) and a presentation that will be useful to attendees (or other downloaders) after the fact that has actual content on it as the presenter is no longer there to fill in the blanks.

He gave me a great suggestion - prepare two decks. take my typical "stand-alone" decks which is very dense, the make a copy of it and strip the copy down. Way down.

So many of the bullet points are things I'm talking about. Why should the attendees need to be destracted by so many details on the deck when I'm talking about them anyway?

But, and here's what's great about this idea - use the dense deck to share with attendees after the fact. All of the details that I talked about are now there right on the deck for their benefit.

I love this idea so much that I did it to my decks for the DevSummit. I have done one of my sessions already using the stripped down deck, then gave the stand-alone version of the deck to the track chair to put on the website.

I'm doing a silverlight talk this afternoon and cut the deck in half and on the remaining slides, removed a lot of content and replaced some of it with images instead. No smiley faces though.

I get to have my cake and eat it to and I think it's a win-win for the attendees during and after the live session.

Thursday, April 10, 2008 6:34:14 AM (Eastern Standard Time, UTC-05:00)  #     |  Comments [3]  | 
 Wednesday, April 09, 2008

I'm not a DBA. I've probably said that about 5000 times. So I am often pretty much out of the loop in the world of SQL Server. So, I really embarrassed myself today asking Niels Berglund if he was a SQL Server guy. I now realize that it would be like asking Kimberly Tripp if she was a SQL Server gal.

And because I am also on a mission to make sure that DBAs are at least aware that the EDM and Entity Framework supports stored procedures, I continued to dig my hole deeper by asking him if he knew that. Turns out he did a full day workshop on LINQ to SQL and Entity Framework at DevWeek in the U.K. I didn't know about this when I wrote a blog post about DevWeek.

So I will now be subscribing to Niels' blog along with Bob B's, since I'm always trying to better understand the DBA perspective on Entity Framework.

Wednesday, April 09, 2008 9:00:56 AM (Eastern Standard Time, UTC-05:00)  #     |  Comments [0]  | 

I attended Christian Weyer's Astoria sesson this morning at the DevSummit , one of the few not in Swedish that I could understand! In fact, I was surprised to walk into Tess Ferrandez's session and hear her speaking fluent Swedish. it turns out she lived in Sweden for a time.

Christian shared a brilliant quote in his session which was how to explain REST in one sentence. He got it from David Meggison's "REST - The Quick Pitch" blog post.

With REST, every piece of information has its own URL.

I have had to try to explain REST in my own Astoria talks and I am going to adopt this brilliant quote. Thank Christian!

We'll see if Christian survives his stay in Stockholm as he had quite a lot of fun (and it was hilarious I have to say) talking about the World Cup Soccer 2006. Hey, they only beat Sweden by 2 goals!  My only memory of the World Cup was all of the TechEd attendees swarmed swarmed around the many screens at the conference displaying the matches.

Wednesday, April 09, 2008 8:51:32 AM (Eastern Standard Time, UTC-05:00)  #     |  Comments [0]  | 

The snacks at the DevSummit in Stockhom speak loudly of the healthy living of the Swedes.

Here is fruit and some yummy mango banana smoothies!

I remember the year at TechEd just after Steve Ballmer slimmed down and got healthy. The afternoon snacsk of candy bars, chips and hostess cupcakes was replaced with healthier fare - baked potato chips, celery and carrot sticks, stuff like that. From one extreme to another.

The above is MUCH more my speed, though I was also quite happy to find bite sized toblerone bars at one of the vendor booths!

Wednesday, April 09, 2008 8:39:08 AM (Eastern Standard Time, UTC-05:00)  #     |  Comments [1]  | 
 Monday, April 07, 2008

Spring has arrived in Vermont, but I'm leaving.

This afternoon I start my overnight journey to Stockholm where I will be participating in the Developer Summit 08 and have been working with Patrik Lowendahl and Mats Rydin who are coordinating. Patrik's company, Cornerstone is instrumental in this conference and everyone there has been wonderful in helping get me prepared.

I'm really looking forward to it. Stockholm is an incredibily beautiful city with lots of history and I've never been there before. Plus there's a great line up of speakers some who are friends that I always look forward to hanging out with and others who I am looking forward to finally meeting! And David Chappell, who is coming by way of Eilat Israel (a 2 day trip) from TechEd, is giving the keynote!

When I have asked anyone if they want me to bring anything back for them, they all have said "oh, yes, a beautiful Swede!" Well at least my single friends have made that request.

Swedish is not among the languages I ahve ever studied so I was happy to find some really useful lessons on Survival Phrases.com. I downloaded a bunch to my iPod to listen to again if I need them. They don't just say how to say a phrase but when it's appropriate as well as providing other background.

I still needed to see what these words look like so a simple list like Basic Swedish Phrases provides good backup. This won't enable me to give my presentatino in Swedish, but at least I can be polite when I have to find the toaletten.

I'll be doing an Advanced EF Session, a talk on Silverlight Annotation and on Friday a full day workshop on Entity Framework including some Hands on Labs. It should be a blast.

And even with my dreadful lschedule right now, I'd be a fool not to at least poke around Stockholm so I am flying home on Sunday (6am flight -uggh) and will have Saturday off to be a tourist.

Monday, April 07, 2008 10:02:58 AM (Eastern Standard Time, UTC-05:00)  #     |  Comments [1]  | 
 Saturday, April 05, 2008

In my previous post, I managed to update a simple model from an existing database. But then I started trying to do things like build my project and ran into so many problem trying to get my simple model to interact with the AdventureWorks database that I finally gave up.

I actually wrote my thoughts on this in a question on the MSDN forum for Entity Framework, with the point of the question being "is there a real example of this? Or is it just a concept that looks good on paper?"

I care a lot about this becuase I have been sharing this concept (which does make sense to me) that the EDMs loose coupling to the database means that you could map the CSDL to different databases.

But the AdventureWorks database just had too many constraints - such as non-nullable fields that I didn't have in my model and I finally gave up because it was forcing me to modify the CSDL and I would also have to add in some business logic to deal with some of these non-nullable fields. And even if I did that, who knows what other problems would pop up?

Update after I gave myself a little time while eating lunch to think about this some more, I crossed out "finally gave up" becasue it's basically not in my nature. I decided to go about this in a different direction with just ONE entity and succeeded by removing the unused non-nullable fields from the SSDL and mapped the entity to Insert/Update/Delete sprocs. All I have to say to myself at this point is "well, duh!" The insert stored proc provides the missing non-nullable fields and the update stored proc updates the modifieddate for me. SO problem solved in a not very realistic example, but I plan to build it up thought not today - I've already invested too much time. There's a lot of flexilibity in the model, but we all still have a lot of learning to do for our various use cases.

You can read my more complete thoughts on this in the forum post and if you want to follow the conversation you can sign up to get alerts on this thread from the MSDN forums.

Oh, and if you've never signed up for alerts before, you might want to read this blog post I wrote last summer: A few MSDN Forums tips (which I learned the hard way - as usual).

Saturday, April 05, 2008 12:47:18 PM (Eastern Standard Time, UTC-05:00)  #     |  Comments [0]  | 

When you use the UpdateModel feature of the Entity Framework design tools, the process relies on matching up existing entity names to table names, more specifically name of objects in the CSDL with names of objects in the database.

IF you have selected objects to add and nothing with that name already exists, it will add a new entity in the model, otherwise, it will use the existing entity.

There are changes coming to how this works detailed in this blog post by Noam Ben-Ami.

But I got bit by something that I overlooked which took hours to pinpoint the cause of the problem, so I wanted to share it.

I had created a model from scratch that was a simple, generic commerce app (see image below). I created entities for Customer, Order, LineItem, Address and Product with some properties, entity keys and associations.

Then I linked it up to  a database using UpdateModel to create the SSDL for me but nothing happened.

It took a lot of experimenting before I realized that the problem was that I was trying to add in a CustomerAddress table but I had an association named CustomerAddress. If that had been an entity, it wouldn't have posed a problem. But the wizard did not know how to handle the fact that it was an association and just completely gave up the ghost.

The only problem I see here is that some indication of the conflict would have helped me figure out what was wrong a little sooner, though I don't expect the wizard to overcome the conflict on its own. I did make a note of this in the forums. However, I am putting the info here for posterity in case it's too late to change the wizard for RTM and somebody else gets stuck on the same problem.

Saturday, April 05, 2008 9:28:29 AM (Eastern Standard Time, UTC-05:00)  #     |  Comments [0]  | 
 Friday, April 04, 2008

Here's the story of where the new movie The Forbidden Kingdom comes from  - bedtime stories told by a man who lives nearby in Morrisville, VT to his son.

I just watched the trailer online and it looks awesome. I love the fanastical Jet Li kung fu style movies including of course, the Kill Bill series. Oddly, I can't bare to watch violent films but love this genre.

Friday, April 04, 2008 4:26:31 PM (Eastern Standard Time, UTC-05:00)  #     |  Comments [0]  | 

Over the next few months I'll be presenting at 4 conferences in Stockholm, Orlando, Toronto then again Orlando. I'll be doing talks on Entity Framework, Astoria, Silverlight and Data Access in general. Details and links are here...

[A New DevLife Post]

 

Friday, April 04, 2008 3:05:21 PM (Eastern Standard Time, UTC-05:00)  #     |  Comments [0]  | 

August 2008 Note: the datadeveloper.net site is "in between hosts". I am not responsible for this site, just a contributor. I don't have access to the tutorials but I have found some copies of them and am putting them here: www.learnentityframework.com/tutorials.


I've written a set of Entity Framework (and one which is more general for LINQ to Entities and LINQ to SQL) tutorials that are on DataDeveloper.NET Tutorials page.

Most of these are beginner basics. The "101 Tutorials" are designed to make sure new programmers don't get completely lost. So if you need the extra handholding, it's there, if not just skim over it to get to the juicy bits.

The Tutorials so far are:

101 Tutorial:Creating an ADO.NET Entity Framework Entity Data Model

101 Tutorial: Use an Entity Framework Entity as a WinForms Data Source

Many to Many Relationships in the Entity Data Model

Using Stored Procedures for Insert, Update & Delete in an Entity Data Model

Naming conventions in an Entity Data Model: Cleaning up the wizard-generated EDM

Adding items to a LINQ Query of anonymous types - after the fact

101 Tutorial: ASP.NET DataBinding with the Entity Framework

101 Tutorials: WPF Databinding with Entity Framework

Friday, April 04, 2008 2:41:24 PM (Eastern Standard Time, UTC-05:00)  #     |  Comments [0]  | 
 Thursday, April 03, 2008

Debug breakpoints stopped working in my Silverlight 2.0 project.

There's one very good reason why debugging won't work which Karsten blogs about in his post "What To Do When Breakpoints Disappear and Debugging Dies In Silverlight 2".

But that wasn't my problem. I had SL debugging on.

My project was from the template which creates a Web App to host and I finally realized that somehow the web app and the silverlight app were no longer linked. WHen I recreated the link debugging was back. Not that I need to debug becuase like you, my code is perfect the first time around! ;-)

Thursday, April 03, 2008 7:52:40 PM (Eastern Standard Time, UTC-05:00)  #     |  Comments [0]  | 
 Wednesday, April 02, 2008

I'm in SHOCK. I just learned about this option that I've always wanted in poweropint.

When I present I always print out a set of 3 per page handouts then write notes to myself about demos in the area to the right.

I often lose or throw away my notes and kick myself next time I want to do the presentation.

I came across Tip #2448 - Creating Custom PowerPoint Handouts in MS Word  on the web when I finally entered the right combination of words in google and realized that the functino exists RIGHT IN Powerpoint. In Powerpoint 2007 it's in the Publish menu.

Wednesday, April 02, 2008 4:22:39 PM (Eastern Standard Time, UTC-05:00)  #     |  Comments [0]  | 

The return type of a LINQ query is an IQueryable, even a LINQ to Entities query.

Here is a screenshot of a LINQ to Entities query at design time (code is NOT being debugged).

But when the query has been processed, it's no longer an IQueryable, but an ObjectQuery.

What's going on here?

At design time, the compiler recognizes that it's a LINQ query and therefore assumes the return will be an IQueryable.

However LINQ to Entities queries are sent to ObjectServices which return an ObjectQuery, so after it's processed, it is actually an ObjectQuery.

So, since it's an ObjectQuery after all, wouldn't it be nice to leverage ObjectQuery features like MergeOptions on a LINQ to Entities query? You can!

But how? At design time, the query is an IQueryable, not an ObjectQuery and doesn't have MergeOptions.

No worries. ObjectQuery implements IQueryable.

So you can cast the LINQ to Entities query to an ObjectQuery, set the MergeOption and, as Jeffrey Palermo would say, party on the LINQ to Entities query (though he may not be likely to say that in the context of Entity Framework ;-)).

    Using context As New AdventureWorksLTEntities
      Dim query = From c In context.Customer Where c.LastName.StartsWith("S")
      Dim objquery = CType(query, ObjectQuery(Of Customer))
      objquery.MergeOption = MergeOption.OverwriteChanges
      Dim cust = query.ToList.First
      Console.WriteLine(cust.LastName)
      cust.LastName = cust.LastName.Trim & "___XYZ"
      cust = query.ToList.First
      Console.WriteLine(cust.LastName)
    End Using

Notice that I'm still performing the operations against the  LINQ query after I cast it to the ObjectQuery.

I could also have done something like

Dim custs = objquery.Execute(MergeOption.OverwriteChanges)

Thanks to Danny for reminding me about the casting! The blog post is intended to lock it into my brain.

Wednesday, April 02, 2008 3:44:46 PM (Eastern Standard Time, UTC-05:00)  #     |  Comments [0]  | 

I was fiddling with compiled queries yesterday and thought I would share what I saw as results. This is anything but laboratory benchmark testing so take it for what it's worth. I did only a very simple query to start with, finding SalesOrders whose total is greater than a given number.

You can do this with Entity SQL or LINQ to Entities. Here is my LINQ to Entities compiled query:

Dim compQuery = CompiledQuery.Compile(Of AdventureWorksLTEntities, Decimal, IQueryable(Of SalesOrderHeader))( _
Function(ctx As AdventureWorksLTEntities, total As Decimal) _ From order In ctx.SalesOrderHeader _ Where (order.TotalDue >= total) _ Select order)

To interpret this, Compile's signature looks like this:

Compile(list of args, returntype)(delegate)

It takes a list of arguments and a return type then performs an operation (defined in the delegate) on the arguments. I'm defiining this compilation to recieve an AdventureWorksLTEntities instance and a decimal and the return will be an IQueryable of SalesOrderHeaders.

VB
CompiledQuery.Compile(Of AdventureWorksLTEntities, Decimal, IQueryable(Of SalesOrderHeader))
C#
CompiledQuery.Compile<AdventureWorksLTEntities, Decimal, IQueryable<SalesOrderHeader>>

For the delegate, I use a labmda epxression that says what to do with the parameters which is to build the query.

VB
(Function(ctx As AdventureWorksLTEntities, total As Decimal) _
From order In ctx.SalesOrderHeader _
Where (order.TotalDue >= total) _
Select order)

c#
(ctx, total) => 
from order in ctx.SalesOrderHeader
where (order.TotalDue >= total)
select order)

The whole query is tied to a variable

Dim myCompiledQuery=CompiledQuery.Compile(....

Then when I want to run the query, I invoke it and pass in the parameters

Dim AWEntities As New AdventureWorksLTEntities
Dim orderTotal=200
Dim orders As ObjectQuery(Of SalesOrderHeader) = compQuery.Invoke(AWEntities, orderTotal)

The first time the compiled query is run, it still has to compile, but after that it uses the results of the compilation and can swap in the parameters without needing to recreate the generated command tree.

You can see a big difference between running the query without pre-compilation and running it with the compiled query.

Brian Dawson does some more intense testing and compares LINQ to Entities to Entity SQL as well in this blog post. But I just needed to actually do it myself, rather than only reading about it.

LINQ to SQL also has compiled queries. Rico Mariani has a series of posts on this starting here.

Wednesday, April 02, 2008 9:26:41 AM (Eastern Standard Time, UTC-05:00)  #     |  Comments [0]  | 

Bill Burrows has created a series of videos on MVC and is now working on a new series based on Scott Guthrie's MVC tutorial posts (which are all in C#) but using VB instead. I was surprised to find a pointer to my recent MVC post as a "rare example" of MVC with VB (and it's only one little post so I found that to be sad) so I'm happy Bill is doing these. It gives a leg up to VB developers who find it hard to try to learn something that is VERY new and convert the C# syntax in their brain at the same time.

Here's the list of topics covered

  An Overview of the MVC Pattern
  Setting up the MVC Preview Environment
  URL Routing
  Setting up New Pages
  MVC Controller Actions 
  Creating HTML in Views 
  MVC - Putting it all together

Thanks to Beth for the heads up.

ASP.NET | VB
Wednesday, April 02, 2008 8:19:32 AM (Eastern Standard Time, UTC-05:00)  #     |  Comments [0]  | 

While Mother Nature played a  joke on us with 60 degree weather and high winds, followed by freezing temps, leaving a big skating rink outside our house for the poor doggies to try to manuever on... and not much left to ski on :-( , there were a bunch of silly April Fool's jokes online for us geeks yesterday.

Here are a few that I know of. Feel free to share some more.

[A New DevLife Post]

Wednesday, April 02, 2008 7:58:40 AM (Eastern Standard Time, UTC-05:00)  #     |  Comments [0]  |