Tuesday, January 29, 2008

Oh now I am really excited. I've been very interested in ASP.NET MVC but have been trying to stay focused on learning Entity Framework.

Now I get to have my cake and eat it too, as Brad Abrams just posted a sample of using the two together.

I'm off to try it out!

Tuesday, January 29, 2008 4:27:49 PM (Eastern Standard Time, UTC-05:00)  #     |  Comments [1]  | 

And they all seemed pretty surprised that there were so many cool creative and tech companies in Vermont who were looking for employees!

I saw on Cairn Cross' blog  (he works for a local VC) that the folks at the entrance of Satruday's Vermont 3.0 event "stopped counting after 1,000"!

Eva Sollberger made an incredible video of the day. Check it out!

Tuesday, January 29, 2008 1:08:19 PM (Eastern Standard Time, UTC-05:00)  #     |  Comments [0]  | 

QVAULT in Burlington has an opening for an .Net Developer. "We are looking for more of an Entry Level to Associate Level person, but are willing to see and consider a more experienced person if they are a good match."

Skills Required

ASP.NET, C#, Web Services

Job Description

If you are an experienced ASP.NET developer, or a soon to be or recent graduate of a programming oriented curriculum, who wants to work for a great Vermont Owned company, read on!

Qvault is looking for a talented software developer who prefers a fast paced and diverse environment, an individual who is a creative self-starter and desires to be an integral part of a team building a young company.

Required skills:

- Understanding of ASP.NET
- C#
- Web Services

Desirable skills:

- AJAX
- XML
- JavaScript
- SQL Fundamentals (MS SQL platform, management tools, jobs)
- SQL Stored Procedures
- HTML/XHTML
- Web standards and cross-browser/platform delivery
- ColdFusion
- IIS6

About Qvault:

Qvault, Inc., a privately held corporation; develops, hosts and supports web based business intelligence, collaboration and document/content management solutions for professional organizations throughout North America.  Please visit our website at www.Qvault.com.  Qvault's main offices are located in downtown Burlington, Vermont.

Tuesday, January 29, 2008 10:42:28 AM (Eastern Standard Time, UTC-05:00)  #     |  Comments [0]  | 

A great resource from the WPF SDK Blog

WPF Basic Data Binding FAQ

Tuesday, January 29, 2008 9:59:10 AM (Eastern Standard Time, UTC-05:00)  #     |  Comments [0]  | 

There's a big difference between looking for a problem to solve with LINQ vs realizing LINQ will solve the problem at hand. Patrik Lowendahl had his "aha!" moment recently. Read more....

[A New DevLife Post]

Tuesday, January 29, 2008 9:26:25 AM (Eastern Standard Time, UTC-05:00)  #     |  Comments [0]  | 

I have been waiting for this information for quite some time! Read more...

[A New DevLife Post]

Tuesday, January 29, 2008 8:46:19 AM (Eastern Standard Time, UTC-05:00)  #     |  Comments [0]  | 

Yes, it's true. Right here in Burlington. Apparently it got a little "out of control".

Tuesday, January 29, 2008 8:10:21 AM (Eastern Standard Time, UTC-05:00)  #     |  Comments [0]  | 
 Monday, January 28, 2008

Mike Pizzo from the Data Programmability team is doing a webcast on Wednesday.

MSDN Webcast: Programming LINQ and the ADO.NET Entity Framework (Level 200) 
Event ID: 1032364888
      Register Online 
 
Language(s):  English. 
Product(s):  SQL Server. 
Audience(s):  Developer. 
 
Duration:  60 Minutes 
Start Date:  Wednesday, January 30, 2008 11:00 AM Pacific Time (US & Canada) 

Event Overview

Language Integrated Query (LINQ) introduces an exciting new way for applications to build strongly typed queries that are deeply integrated into the programming language. The ADO.NET Entity Framework allows applications and services to work in terms of an application-oriented Entity Data Model, decoupling the application's data model from the storage considerations of the relational schema. Join this webcast to see how these two technologies work together to change the way applications work with data.

Presenter: Michael Pizzo, Principal Architect, Microsoft Corporation

Michael Pizzo is a principal architect on the Data Programmability Team at Microsoft. He has been at the forefront of data access for the last 17 of his 20 years at Microsoft, including contributing to Open Database Connectivity (ODBC), Object Linking and Embedding Database (OLEDB), ADO, ADO.NET and now the Entity Framework. Michael has been a member of the ANSI X3H2 Database Standards Group and a U.S. representative in the International Standards Organization (ISO) meeting that approved the SQLCLI as an extension to SQL92.

View other sessions from: SQL Server 2008: Develop Strong Database Applications

If you have questions or feedback, contact us.

Monday, January 28, 2008 6:38:54 PM (Eastern Standard Time, UTC-05:00)  #     |  Comments [0]  | 

I thought I would give the Xceed WPF DataGrid (it's free!) a whirl with Entity Framework databinding. So far I have only explored the basics - no anonymous types or sprocs and I am only working with a READ-ONLY scenario. (I did notice something in their docs about being able to modify and delete but not add when binding to LINQ to SQL queries.) I have, however, at least used a multi-level object graph.

Here's what I've come up with.

Add the grid

  1. Drop an Xceed WPF DataGrid on a WPF Window

Preparing the data

  1. I created an EDM from AdventureWOrksLT. The namespace is awModel and the EntityContainer is awEntities. I also fixed up some naming, plurazing the EntitySets and the navigation properties that point to collections. (This is my standard routine when creating EDMs)
  2. In the Loaded event for the WIndow, add the following
Dim aw = New awModel.awEntities
Me.DataGridControl1.ItemsSource = From ord In aw.SalesOrderHeaders.Include("Customer") _
Select ord

Setting up the grid for Databinding

If you've never used WPF, or done databinding in WPF, there are definitely a lot of new things to learn! The easiest thing to do for now is just copy and paste all of this XAML below.

Here's what the entire XAML looks like.

<Window x:Class="Window2"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window2" Height="300" Width="300" Name="Window1" xmlns:xcdg="http://schemas.xceed.com/wpf/xaml/datagrid"
        xmlns:local="clr-namespace:WpfApplication1.awModel">
    <Grid>
    <Grid.Resources>
      <DataTemplate DataType="{x:Type local:SalesOrderHeader}">
        <TextBlock Text="{Binding TotalDue}"/>
      </DataTemplate>

      <DataTemplate DataType="{x:Type local:Customer}">
        <TextBlock Text="{Binding Customer.CompanyName}"/>
      </DataTemplate>

    </Grid.Resources>

    <xcdg:DataGridControl Margin="10,9,4,0" Name="DataGridControl1" ItemsSource="{Binding}" >
      <xcdg:DataGridControl.Columns>

        <xcdg:Column FieldName="Customer.CompanyName" Title="Company" />
        <xcdg:Column FieldName="TotalDue" Title="Total Due"/>
      </xcdg:DataGridControl.Columns>

    </xcdg:DataGridControl>

  </Grid>
</Window>

The xml namespace tag xdcg get's added automatically when you drop the DataGrid on the window.

The xml namespace tag "local" is something I added. It's necessary for subsequent references to classes from my EDM. Intellisense will help you pick the right namespace (your app and your model name) if you start with clr-namespace:.

In my query, I queried for SalesOrderHeaders plus their customer EntityRefs. In the DataTemplates, you can see that I'm referencing the actual object model types and then binding to the property from the SalesOrderHeader that is returned in my query.  "TotalDue" gets me "SalesOrderHeader.TotalDue" and "Customer.CompanyName" gets me "SalesOrderHeader.Customer.CompanyName". The DataTemplate provides binding to the data source (defined in the ItemsSource setting in the code above). Then the DataGrid column tie back to the bindings by way of the FieldName property.

Run the app

Note that I did not sort in my query.  I wanted to demonstrate the grid's built in sorting , but for some reason it's not working in this scenario (stay tuned...I'll get to the bottom of that).

The automatic grouping does work, though. AdventureWorksLT is not great for seeing this. Only Thrifty Parts and Sales happens to have more than one order.

Monday, January 28, 2008 2:12:26 PM (Eastern Standard Time, UTC-05:00)  #     |  Comments [7]  | 

I spent a lot of time playing (and just attempting to play) with the new CR2008. Both what's included out of the box with Visual Studio 2008 and their standalone application. There were a lot of surprises. I wrote an article about everything I learned about things like backwards compatiblitiy, integration into different versions of Visual STudio, etc. It's here on ASPAlliance: What Visual Studio Developers Should Know About Crystal Reports 2008

Monday, January 28, 2008 1:32:00 PM (Eastern Standard Time, UTC-05:00)  #     |  Comments [0]  | 
 Sunday, January 27, 2008

A question came up in the EF forums today asking if the delay of SQL Server 2008's release will mean EF will be delayed.

The two are not related.

There is a misconception that Entity Framework is tied to SQL Server 2008. It's definitely not. These are .NET APIs and will work with many database providers (when those providers are written).

As far as I know, the official word on EF's release remains "1st half of 2008". Something tells me that won't be any time in January. ;-)

Sunday, January 27, 2008 8:13:47 PM (Eastern Standard Time, UTC-05:00)  #     |  Comments [0]  | 

Yesterday I did a fun session at the Vermont 3.0 event titled: "Software Developer: Career or Addiction?".

I've had a bad chest cold for 2 weeks and yesterday was actually better day for me than these past weeks.

I took all I could to prevent coughing.

The talks were all being recorded by the local public access channel.

Apparently, according to DanZ (who was standing near the area where the video feed was being monitoried) what coughing I did do (and I don't recall caughing UP anything, as gross as he makes it sound - eeeew) sounded seriously nasty over the mic. I'm definitely not looking forward to hearing that.

Throughout the day, every time I met someone who wanted to shake hands I had to tell them "oh, no, you do NOT want to touch me". I even passed up shaking hands with Sen. Bernie Sanders. I didn't want to be responsible for passing this cruddy cold onto him! (or anyone)

And Dan, thanks for not stealing my car! ;-)

Sunday, January 27, 2008 6:21:04 PM (Eastern Standard Time, UTC-05:00)  #     |  Comments [0]  | 

Eve Sollberger is a video blogger for Seven Days. She recently visited the new 65,000 square foot office of Dealer.Com, one of vermont's fastest growing companies. DDC builds websites for car dealers around the country and is one of the top in their industry. They were recognized in September by Inc magazine as being one of the fastest growing private companies in the country. DDC is great for Vermont and Vermont has definitely been great for them. Their new facilities are clearly loved by their employees as you can see in Eva's video. There's even a gym (with tennis courts) and an organic cafe.

Check out the video.

There are lots of cool tech companies here. Yesterday's Vermont 3.0 Creative Tech career jam showed that off. I'll be blogging (and linking) more about that PHENOMENALLY SUCCESSFUL event shortly.

Sunday, January 27, 2008 4:12:50 PM (Eastern Standard Time, UTC-05:00)  #     |  Comments [1]  | 
 Friday, January 25, 2008

Danny Simmons has posted the code for his EntityBag class (aka "Perseus") on the MSDN Code Gallery Site here.

I grabbed it last night and set up a test project so that I could see what the payload looks like.

The results of that test are in this blog post, Testing out the EntityBag.

There were a few tricks for getting the web service to work properly if you are not familiar with using WCF, so I wanted to show that code.

I started by creating a DLL library just to host my EDM.

Then I created a WCF Service. The WCF service references the EDM project and the Perseus project.

I created my interface along with a HelloWorld op which is always handy for testing.

<OperationContract()> _
   <ServiceKnownType(GetType(SalesOrderHeader))> _
   <ServiceKnownType(GetType(SalesOrderDetail))> _
 Function GetData(ByVal value As Integer) As Perseus.EntityBag(Of SalesOrderHeader)

 <OperationContract()> _
 Function HelloWorld() As String

There's something critical in the above example. Without the ServiceKnownType declarations for the SalesOrderHeader and SalesOrderDetail, you will get an error when the service tries to serialize the return data. You can read more about this here. In C#, you use typeof() where I have GetType().

Then I created the methods that implement these interfaces in my Service class.

 Public Function GetData(ByVal value As Integer) As Perseus.EntityBag(Of SalesOrderHeader) _
  Implements IService1.GetData
    Using aw As New awEntities
      Dim order = (From ord In aw.SalesOrderHeaders.Include("SalesOrderDetails") _
                  Where ord.SalesOrderID = value _
                  Select ord).First
      Return aw.CreateEntityBag(Of SalesOrderHeader)(order) 
    End Using 
  End Function

  Public Function HelloWorld() As String Implements IService1.HelloWorld
    Return "Hello World"
  End Function

Next is the ConsoleApp that will call the service.

Nothing fancy here, I make a service reference to the service in the project and a references to the Perseus project and the project that hosts my EDM. In code, I instantiate the service, then call HelloWorld to make sure things are wired up properly and finally the GetData method passing in an  OrderNumber. Not sure why I didn't use orderid. Just too focused on other things at the time!

   Dim ordEntityBag As Perseus.EntityBag(Of SalesOrderHeader)
   Dim svc = New ServiceReference1.Service1Client
   Dim s = svc.HelloWorld
   Try
     ordEntityBag = svc.GetData(71780)
   Catch timeout As TimeoutException
     svc.Abort()
   Catch commException As System.ServiceModel.CommunicationException
     svc.Abort()
   End Try

This returns an unmodified object. Next I wanted to see what it looked like if it was modified so I just added some code into the GetData method in the service.

Public Function GetData(ByVal value As Integer) As Perseus.EntityBag(Of SalesOrderHeader) Implements IService1.GetData
  Using aw As New awEntities
    Dim order = (From ord In aw.SalesOrderHeaders.Include("SalesOrderDetails") _
                Where ord.SalesOrderID = value _
                Select ord).First
    order.Comment = "12345"
    Dim i As Int32
    For Each sd As SalesOrderDetail In order.SalesOrderDetails
      sd.OrderQty = 25
      If i = 10 Or i = 12 Then
        sd.OrderQty = 0
      End If
      i += 1
    Next
    Dim sod = From s In order.SalesOrderDetails Where s.OrderQty = 0 Select s
    For i = sod.Count To 1 Step -1
      aw.DeleteObject(sod(i - 1))
    Next 
    Return aw.CreateEntityBag(Of SalesOrderHeader)(order)

  End Using

End Function

Here's what the EntityBag for this looks like when it gets back to the client:

Friday, January 25, 2008 12:29:21 PM (Eastern Standard Time, UTC-05:00)  #     |  Comments [0]  | 

Zlatko wrote the eSQLBlast tool.

Danny's been writing Extension Methods and the ENtityBag class.

There is also a new tool for examining how code generation is done from an EDMX file. (As well as a blog by Sanjay about how code gen is done.)

All of these and future stuff are now collected under one umbrella, the Entity Framework Toolkits and Extensions page on the new MSDN Code Sharing site.

It also has an RSS feed, so you can see what gets added in the future.

Thanks Diego for pointing it out.

Friday, January 25, 2008 10:46:57 AM (Eastern Standard Time, UTC-05:00)  #     |  Comments [0]  | 

This is completely insane. Someone from Romania emailed me about selecting an icon file for a ClickOnce deployment so that the application icon is used for the installation and for the shortcut.

He had tried my hack that I have blogged about, written about in CoDe Magazine and shown in conference presentations. The hack requires manual editing of the manifest file and I learned it in the forums.

I had never been able to discover any other way to do it.

There is a new version of the MAGEUI tool, the UI for building ClickOnce manifests, so I went in to see if there was anything different with respect to that.

On the file page, things looked the same as always:

So I was staring at it and looking at the file type column and wishing I could use it. But it's always appeared to be disabled. While I was staring and thinking, I was clicking on that and on the second click, a drop down list appeared.

And when I clicked the arrow, there it was!

Understand, that in a normal UI property sheet like this, the arrow would be visible when you first click the cell.

So I went back to the previous version of MAGEUI and after two clicks, no dropdown. But guess what, one more click and there it was!

All this time? All of the blog posts I wrote, the article in CoDe Magazine. Nobody every emailed me to tell me "oh, here's how". You'd think...  Clearly it's not THAT obvious! Oh well.

I haven't ever seen this documented (though I sure wish there was a copy of Brian Noyes ClickOnce book nearby to see if he knew).

Well, there you have it.

Friday, January 25, 2008 10:30:05 AM (Eastern Standard Time, UTC-05:00)  #     |  Comments [0]  | 
 Thursday, January 24, 2008

I've been fiddling with the EntityBag that Danny Simmons wrote. My biggest interest was in how big the payload is.

I created a service that had two operations. The first returns "Hello World" and the second returns an EntityBag for an AdventureWorksLT SalesOrderHeader graph that includes it's SalesOrderDetails.

Then I created a console app to call the two operations, passing in a sales order number for the second. The particular order I chose had 14 sales order details.

When digging into the message trace, here is the payload of the Hello World (it's encrypted (symmetric) - so slightly larger than the actual 11 letters :-)) and the payload from the EntityBag when the entity is unmodified.

Next I edited the order. I modified one value in the order and one value in each detail. I deleted two details from the order.

Here's what the EntityBag looks like after this:

Yet the payload is not very much different in size than before

It's good to see the size of this as stake in the ground. It's only one entity graph. Now you can see why serializing an objectcontext can be very expensive! The whole concept is still very interesting. I can see using this thing carefully, for example only sending entitybags for modified entities and not wasting the bandwidth to send a whole entitybag that just says "nothing's changed".

I'll dig further (thanks for the great entertainment Danny) and tomorrow I'll show how I built the service. There are a few WCF tricks you need to be aware of.

I haven't fiddled with WCF in a while and it was fun digging in again and poking around in the messages.

Thursday, January 24, 2008 10:10:03 PM (Eastern Standard Time, UTC-05:00)  #     |  Comments [0]  | 

This is a small milestone for me.

I had to add a feature to a website for a client and thought it would be a great opportunity to use LINQ to SQL. So I built the feature with LINQ to SQL , had the sysadmin add .NET 3.5 runtime to the webserver and deployed it.

Works great!

Big grin....

Thursday, January 24, 2008 2:24:18 PM (Eastern Standard Time, UTC-05:00)  #     |  Comments [0]  | 

My last post was about LINQ and EF Data Providers, which made me think of this.

I received an email recently asking if I knew of anyone writing an Entity Framework provider for Access.

I don't happen to know of any.

However there's a reason.

In the forums, there is a post from July where Danny Simmons explained the hurdles with a possible Access provider:

The OLE-DB ado.net provider has not been extended to support the entity framework, and we do not currently have plans to do so in our first release.  Further, this would be a fairly difficult effort because OLE-DB doesn't provide enough information in general to translate CQTs (canonical query trees--the entity framework intermediate query representation) to a particular back-end query syntax.  So, while it would be possible to write an Access provider which would translate from CQTs to the particular query syntax that access uses, we don't have an access-specific ado.net provider, and the general OLE-DB provider would not be able to do the job.

We have done some internal prototyping of how Access and the entity framework might work great together in the long-run, but those were just explorations, and we will not have direct support for Access in the first release of the entity framework.

 

Thursday, January 24, 2008 1:00:53 PM (Eastern Standard Time, UTC-05:00)  #     |  Comments [1]  | 

People are always asking "when will I be able to use LINQ against databaseA or databaseB?" and "when will I be able to use Entity Framework against databaseA or databaseB?"

In my mind this is the same question, though most who are asking don't realize it. Why?

An Entity Framework provider gets all of the benefits of the Entity Framework and also gets LINQ for free by way of LINQ to Entities.

If a database vendor wants developers to be able to perform LINQ queries against their database, it's not a stretch to think that they might also want developers to be able to use their database within the Entity Framework.

Why write two providers (a LINQ provider AND an EF provider) when they can write just an EF provider and with it, get LINQ capabilities as well?

An added benefit is that with Entity SQL, it is possible to add provider specific functions.  So when a developer reaches a wall trying to write a LINQ query, the can just step back and use Entity SQL for those cases.

I'm definitely using LINQ to SQL where it makes sense for me. In fact, I'm waiting for a sysadmin to throw .NET 3.5 on my client's web server so I can deploy my first production solution that uses LINQ to SQL! :-)

But for any other db's, I'm not waiting to see who is writing LINQ providers for their databases, but who is writing EF providers (here's a current list, by the way).

Thursday, January 24, 2008 10:21:16 AM (Eastern Standard Time, UTC-05:00)  #     |  Comments [3]  |