<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8821795236413349313</id><updated>2011-07-30T10:43:05.201-07:00</updated><category term='C#'/><category term='Logo contest'/><category term='Announcing: Tech Valley Code Camp 2008.2 - November 8th'/><category term='TVUG'/><category term='XNA'/><category term='2008'/><category term='Entity Framework'/><category term='intro'/><category term='about me'/><title type='text'>Bloggin from my Noggin</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://grifftownsend.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8821795236413349313/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://grifftownsend.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Griff Townsend</name><uri>http://www.blogger.com/profile/12292628263957705552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp3.blogger.com/_wtz1ml2FXzY/SI8dYze_IjI/AAAAAAAAAAc/tYqX0kgCmyo/S220/head_shot_small.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>12</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8821795236413349313.post-6691439207335296778</id><published>2009-02-09T05:42:00.000-08:00</published><updated>2009-02-09T05:45:17.304-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TVUG'/><title type='text'>TVUG February Meeting</title><content type='html'>All, &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you haven't noticed, the TVUG site has been down for a week as we were transitioned to new servers by our ISP. Unfortunately, the transition wasn't entirely smooth (as if it taking a week indicates any amount of smoothness), and the mail server is currently kaput. I'll be sending out an official announcement about our February Presentation as soon as I can, but here's the details for those of you who check out the blog (BTW - Thanks to both of you). &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS'; font-size: 13px; "&gt;&lt;h1 style="background-attachment: fixed; background-color: rgb(255, 255, 255); background-image: url(http://www.tvug.net/Portals/_default/Skins/tvug/images/bg_gradient.gif); background-repeat: repeat-x; font-family: 'Trebuchet MS', Arial, sans-serif; font-size: 12pt; font-weight: bold; font-variant: small-caps; color: rgb(102, 102, 153); "&gt;An Anatomy of SharePoint Pages&lt;br /&gt;&lt;/h1&gt;&lt;span style="font-size: 10pt; font-family: 'Trebuchet MS', Verdana, Tahoma, sans-serif; "&gt;&lt;p&gt;&lt;/p&gt;&lt;hr width="100%" size="2" style="color: rgb(105, 105, 105); height: 1pt; text-align: left; "&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Speaker: &lt;/strong&gt;Russ Kehoe, Senior Consultant, Infusion&lt;br /&gt;&lt;b&gt;When&lt;/b&gt;: Tuesday February 17th, 2009 - 6:30-9PM&lt;br /&gt;&lt;b&gt;Where: &lt;/b&gt;&lt;a href="http://www.mapquest.com/maps/map.adp?address=4%20British%20American%20Blvd&amp;amp;city=Latham&amp;amp;state=NY&amp;amp;zipcode=12110%2d1419&amp;amp;country=US&amp;amp;title=%3cspan%20style%3d%22margin%2dbottom%3a0px%3b%22%20class%3d%22adr%22%3e%3cb%20class%3d%22fn%20org%22%3eVersatrans%20Solutions%20Inc%3c%2fb%3e%3cbr%20%2f%3e%20%3cspan%20style%3d%22margin%2dbottom%3a0px%3b%22%20class%3d%22street%2daddress%22%3e4%20British%20American%20Blvd%20%23%202%3c%2fspan%3e%20%3cspan%20style%3d%22display%3ainline%3bmargin%2dbottom%3a0px%3b%22%20class%3d%22locality%22%3eLatham%3c%2fspan%3e%2c%20%3cspan%20style%3d%22display%3ainline%3bmargin%2dbottom%3a0px%3b%22%20class%3d%22region%22%3eNY%3c%2fspan%3e%20%3cspan%20style%3d%22display%3ainline%3bmargin%2dbottom%3a0px%3b%22%20class%3d%22postal%2dcode%22%3e12110%3c%2fspan%3e%2c%20%20%3cspan%20style%3d%22display%3ainline%3bmargin%2dbottom%3a0px%3b%22%20class%3d%22country%2dname%22%3eUS%3c%2fspan%3e%3c%2fspan%3e&amp;amp;cid=lfmaplink2&amp;amp;name=&amp;amp;dtype=s" style="text-decoration: none; color: rgb(0, 51, 102); "&gt;VersaTrans Solutions, Latham, NY&lt;/a&gt; &lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;hr width="100%" size="2" style="color: rgb(105, 105, 105); height: 1pt; text-align: left; "&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Windows SharePoint Services (WSS) and Microsoft Office SharePoint Server (MOSS) make it easy for IT departments to implement dependable, scalable collaboration infrastructures with minimal administrative time and effort. Leveraging ASP.Net 2.0 technology, SharePoint is a relatively painless transition point for most web developers.&lt;/p&gt;&lt;p&gt;Join us as Russ Kehoe, Senior Consultant and Infusion, provides us with an overview on developing sites using SharePoint technologies. Russ will cover a bit of what SharePoint is and how pages work in both WSS and MOSS.  Russ will also present a CodePlex project that significantly enhances the ability to develop custom pages.  We'll also cover some coding tips for SharePoint.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Bio:&lt;/strong&gt;&lt;br /&gt;Russ Kehoe is a Senior Consultant for Infusion Development, a Microsoft partner with offices in Toronto, New York, Boston, and Abu Dhabi. Russ has been developing software in the capital district area for 19 years. You can email him at&lt;a href="mailto:themidnightcoder@hotmail.com" style="text-decoration: none; color: rgb(0, 51, 102); "&gt;themidnightcoder@hotmail.com&lt;/a&gt;.&lt;/p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8821795236413349313-6691439207335296778?l=grifftownsend.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grifftownsend.blogspot.com/feeds/6691439207335296778/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8821795236413349313&amp;postID=6691439207335296778' title='37 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8821795236413349313/posts/default/6691439207335296778'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8821795236413349313/posts/default/6691439207335296778'/><link rel='alternate' type='text/html' href='http://grifftownsend.blogspot.com/2009/02/tvug-february-meeting.html' title='TVUG February Meeting'/><author><name>Griff Townsend</name><uri>http://www.blogger.com/profile/12292628263957705552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp3.blogger.com/_wtz1ml2FXzY/SI8dYze_IjI/AAAAAAAAAAc/tYqX0kgCmyo/S220/head_shot_small.jpg'/></author><thr:total>37</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8821795236413349313.post-2543337387077056573</id><published>2009-01-21T20:09:00.001-08:00</published><updated>2009-01-21T20:21:22.073-08:00</updated><title type='text'>Boston MSDN Dev Conference</title><content type='html'>I'm in Boston tonight, getting ready for tomorrow's Lap Around the Live Framework and Mesh Services presentation. Live Services provide a unique, open, single point of access set of tools for connecting your Contacts, Devices, Applications, and Files.&lt;br /&gt;&lt;br /&gt;While the Live Framework provides a nice C# API to utilize the Live Services, there are already Javascript and Silverlight APIs out there, with PHP and more on the way. Live Services leverage HTTP via Atom, JSON, POX (Plain Old XML), or RSS... it's possible to connect using any language that allows you to work with those structures. In addition, you can use URI-LINQ (LINQ commands sent using http GET requests), perform CRUD, and more. What's more, Live Services provides Synchronization, Caching, and Analytics where appropriate.&lt;br /&gt;&lt;br /&gt;Hope to see you in Boston: if not, I'm pretty sure that we're doing the TVCC2 (Tech Valley Code Camp 2) in the March timeframe, and I'll be snagging a few of the speakers from here for the  event.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8821795236413349313-2543337387077056573?l=grifftownsend.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grifftownsend.blogspot.com/feeds/2543337387077056573/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8821795236413349313&amp;postID=2543337387077056573' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8821795236413349313/posts/default/2543337387077056573'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8821795236413349313/posts/default/2543337387077056573'/><link rel='alternate' type='text/html' href='http://grifftownsend.blogspot.com/2009/01/boston-msdn-dev-conference.html' title='Boston MSDN Dev Conference'/><author><name>Griff Townsend</name><uri>http://www.blogger.com/profile/12292628263957705552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp3.blogger.com/_wtz1ml2FXzY/SI8dYze_IjI/AAAAAAAAAAc/tYqX0kgCmyo/S220/head_shot_small.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8821795236413349313.post-3600416293804167444</id><published>2008-12-10T05:56:00.000-08:00</published><updated>2008-12-10T06:02:35.385-08:00</updated><title type='text'>TVUG December Meeting</title><content type='html'>&lt;span style=";font-family:'Trebuchet MS',Verdana,Tahoma,sans-serif;font-size:10;"  &gt;I realize it's been a while since I blogged. A recession based layoff, followed by heavy consulting work, a trip to PDC, and a great opportunity will do that to you. I've got a lot to talk about in the next few days, but I'll start with the next TVUG meeting, where I'll be speaking about Live Mesh Services.&lt;/span&gt;&lt;br /&gt;&lt;h3&gt;&lt;br /&gt;&lt;/h3&gt;&lt;h3&gt;&lt;b&gt;&lt;span style="font-size:130%;"&gt;A Lap Around the Live Framework and Mesh Services&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;&lt;br /&gt;&lt;span style=";font-family:'Trebuchet MS',Verdana,Tahoma,sans-serif;font-size:10;"  &gt; &lt;hr size="2" width="100%"&gt; &lt;b&gt;Speaker: &lt;/b&gt;Griffith Townsend, Principal Architect, docSTAR&lt;br /&gt;&lt;b&gt;When&lt;/b&gt;: Tuesday December 16th, 2008 - 6:30-9PM&lt;br /&gt;&lt;b&gt;Where: &lt;/b&gt;&lt;a href="http://www.mapquest.com/maps/map.adp?address=4%20British%20American%20Blvd&amp;amp;city=Latham&amp;amp;state=NY&amp;amp;zipcode=12110%2d1419&amp;amp;country=US&amp;amp;title=%3cspan%20style%3d%22margin%2dbottom%3a0px%3b%22%20class%3d%22adr%22%3e%3cb%20class%3d%22fn%20org%22%3eVersatrans%20Solutions%20Inc%3c%2fb%3e%3cbr%20%2f%3e%20%3cspan%20style%3d%22margin%2dbottom%3a0px%3b%22%20class%3d%22street%2daddress%22%3e4%20British%20American%20Blvd%20%23%202%3c%2fspan%3e%20%3cspan%20style%3d%22display%3ainline%3bmargin%2dbottom%3a0px%3b%22%20class%3d%22locality%22%3eLatham%3c%2fspan%3e%2c%20%3cspan%20style%3d%22display%3ainline%3bmargin%2dbottom%3a0px%3b%22%20class%3d%22region%22%3eNY%3c%2fspan%3e%20%3cspan%20style%3d%22display%3ainline%3bmargin%2dbottom%3a0px%3b%22%20class%3d%22postal%2dcode%22%3e12110%3c%2fspan%3e%2c%20%20%3cspan%20style%3d%22display%3ainline%3bmargin%2dbottom%3a0px%3b%22%20class%3d%22country%2dname%22%3eUS%3c%2fspan%3e%3c%2fspan%3e&amp;amp;cid=lfmaplink2&amp;amp;name=&amp;amp;dtype=s"&gt;VersaTrans Solutions, Latham, NY&lt;/a&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;hr size="2" width="100%"&gt;  &lt;p&gt;Live Services is an important part of the Azure Services Platform, providing a set of building blocks for handling user data and application resources that can connect various devices across the Internet and provide data and applications across these devices in a consistent and connected manner.&lt;/p&gt; &lt;p&gt;Live Services open up a whole set of interesting scenarios that were either very difficult to implement or not possible at all until today. The session discusses the fundamentals of Live Services and the overall challenges faced in designing and developing connected applications using a Framework that allows consistent communications across application boundaries and devices. This session delves through various types of objects that are available in this environment, discusses the differences, and explains how to build applications that use them. We’ll introduce and discuss the Mesh Operating Environment, Mesh Objects, and the Live Framework Resource Model.&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8821795236413349313-3600416293804167444?l=grifftownsend.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grifftownsend.blogspot.com/feeds/3600416293804167444/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8821795236413349313&amp;postID=3600416293804167444' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8821795236413349313/posts/default/3600416293804167444'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8821795236413349313/posts/default/3600416293804167444'/><link rel='alternate' type='text/html' href='http://grifftownsend.blogspot.com/2008/12/tvug-december-meeting.html' title='TVUG December Meeting'/><author><name>Griff Townsend</name><uri>http://www.blogger.com/profile/12292628263957705552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp3.blogger.com/_wtz1ml2FXzY/SI8dYze_IjI/AAAAAAAAAAc/tYqX0kgCmyo/S220/head_shot_small.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8821795236413349313.post-5733328040967673403</id><published>2008-09-25T07:20:00.000-07:00</published><updated>2008-11-15T13:12:14.041-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Announcing: Tech Valley Code Camp 2008.2 - November 8th'/><category scheme='http://www.blogger.com/atom/ns#' term='2008'/><title type='text'>Code Camp 2008.2</title><content type='html'>&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span style="FONT-WEIGHT: bold"&gt;UPDATE v 2.0 - The scheduling conflicts never ended, and we have postponed the TVCC to early next year. Date and venue are TBA.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span style="FONT-WEIGHT: bold"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span style="FONT-WEIGHT: bold"&gt;UPDATE:Due to a scheduling conflict, the next Tech Valley Code Camp (2008.2) has been moved to November 22nd.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Andy Badera and myself sat down for a bit at yesterday's &lt;a href="http://blogs.msdn.com/cbowen/archive/2008/09/02/announcing-the-fall-2008-northeast-roadshow.aspx"&gt;Roadshow&lt;/a&gt; event (more on that later), and we've ironed out the date for Code Camp 2008.2.&lt;br /&gt;&lt;br /&gt;Per Andy's blog:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;"&lt;span class="Apple-style-span" style="FONT-WEIGHT: bold"&gt;Announcing: Tech Valley Code Camp 2008.2 - November 22nd, 2008&lt;/span&gt;&lt;br /&gt;It's official -- per conversations at yesterday's Microsoft Northeast Roadshow, we're going to make Tech Valley Code Camp 2008.2 happen. We've even moved the date up a bit -- we're now looking at November 8th, in order to avoid conflicting with a Western NY camp.&lt;br /&gt;&lt;br /&gt;Presenters needed! We're working on getting a registration site up ASAP. Doors are open to non-Microsoft-specific tech, but we'd definitely like to see a healthy dose of Server 2008, SQL Server 2008, .NET 3.5, WPF, Silverlight, etc.&lt;br /&gt;&lt;br /&gt;We have a few sponsors already, I'll followup with a post thanking our first several sponsors. Additional sponsorship, however, is of course quite welcome, and certainly needed.&lt;br /&gt;&lt;br /&gt;Tech Valley Code Camp 2008(.1) was awesome! Now let's make TVCC 2008.2 an even bigger, better experience!&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;If you're interested in presenting or sponsorship, feel free to email either &lt;/span&gt;&lt;/span&gt;&lt;a href="mailto:andrew@badera.us/"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Andy &lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;or &lt;/span&gt;&lt;/span&gt;&lt;a href="mailto:grifft@gmail.com/"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;myself&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; (or both of us). I'd prefer if you include the words Tech Valley Code Camp in the subject of the email. The venue is still TBD, but I'll hopefully have some news on that by the end of next week. &lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8821795236413349313-5733328040967673403?l=grifftownsend.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grifftownsend.blogspot.com/feeds/5733328040967673403/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8821795236413349313&amp;postID=5733328040967673403' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8821795236413349313/posts/default/5733328040967673403'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8821795236413349313/posts/default/5733328040967673403'/><link rel='alternate' type='text/html' href='http://grifftownsend.blogspot.com/2008/09/code-camp-20082.html' title='Code Camp 2008.2'/><author><name>Griff Townsend</name><uri>http://www.blogger.com/profile/12292628263957705552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp3.blogger.com/_wtz1ml2FXzY/SI8dYze_IjI/AAAAAAAAAAc/tYqX0kgCmyo/S220/head_shot_small.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8821795236413349313.post-5459522409330502739</id><published>2008-09-22T10:57:00.001-07:00</published><updated>2008-09-22T11:03:03.215-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='TVUG'/><category scheme='http://www.blogger.com/atom/ns#' term='Logo contest'/><title type='text'>TVUG Logo Submission Guidelines</title><content type='html'>We now have some guidelines for Logo Submissions next month, courtesy of Chris Miller:&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;TVUG website Logo Submission Guidelines &lt;/h2&gt; &lt;ul&gt;&lt;li&gt;&lt;b&gt;The logo should reflect on TVUG and its mission &lt;/b&gt;- Things to think about when brainstorming your design: &lt;ul&gt;&lt;li&gt;.NET Related&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The sharing of technology and ideas with your peers - community!&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;/li&gt;&lt;li&gt;&lt;b&gt;Tips for creating a logo&lt;/b&gt; - Make sure your design communicates the Conference theme   &lt;ul&gt;&lt;li&gt;Use simple shapes and text &lt;/li&gt;&lt;li&gt;Do not use photographs &lt;/li&gt;&lt;li&gt;Use a distinct color scheme (2-3 colors max) &lt;/li&gt;&lt;li&gt;Make sure your logo is in a vector format (Adobe Illustrator), or is created at very high resolution (3600px by 3600 px). This will make sure the logo can be enlarged to huge proportions (signs, banners, etc.) &lt;/li&gt;&lt;li&gt;Be creative! &lt;/li&gt;&lt;/ul&gt;  &lt;/li&gt;&lt;li&gt;&lt;b&gt;Artwork MUST be original &lt;/b&gt;  &lt;ul&gt;&lt;li&gt;You are welcome to get ideas from the Internet, but do not use another designer's work. &lt;/li&gt;&lt;li&gt;No clip art please!&lt;/li&gt;&lt;/ul&gt;  &lt;/li&gt;&lt;li&gt;&lt;b&gt;File specifications &lt;/b&gt;  &lt;ul&gt;&lt;li&gt;Submissions must be one of the following formats:    &lt;ul&gt;&lt;li&gt;Adobe Illustrator (.ai)&lt;/li&gt;&lt;li&gt;Encapsulated PostScript (.eps) &lt;/li&gt;&lt;li&gt;Adobe Photoshop (.psd) or Paint .NET (.pdn)&lt;br /&gt;&lt;ul&gt;&lt;li&gt;NOTE: Bitmap submissions must be at least 3600px wide/tall.&lt;/li&gt;&lt;/ul&gt;    &lt;/li&gt;&lt;/ul&gt;   &lt;/li&gt;&lt;li&gt;Please send us your ORIGNIAL document with the layers intact. Do not merge your work layers. &lt;/li&gt;&lt;li&gt;If you use any special fonts, please include the font names in your submission e-mail. &lt;/li&gt;&lt;li&gt;&lt;b&gt;Name your file&lt;/b&gt; using your first and last name (example: &lt;a href="http://shawngwin.ai/" target="_blank"&gt;shawngwin.ai&lt;/a&gt;). If you submit more than one file, follow the same guidelines and add a number at the end. (example: &lt;a href="http://shawngwin1.ai/" target="_blank"&gt;shawngwin1.ai&lt;/a&gt;, &lt;a href="http://shawngwin2.ai/" target="_blank"&gt;shawngwin2.ai&lt;/a&gt;, etc.). &lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;By sending in a submission, you are granting the TVUG User Group a license to use the artwork on the TVUG website and other media documents.&lt;br /&gt;&lt;br /&gt;More on our speaker once it's solidified.&lt;br /&gt;&lt;br /&gt;I'm also currently working on T4 templates, as well as putting some enhancements into the 2D/3D XNA Engine that I built for some presentations last year. Per-pixel collisions and rotation is now handled in the 2D engine, and I'm looking at either including some pre-built physics functionality in there or putting some basic stuff in there. My hope is to create a simple GUI 2D game builder that will allow kids and adults alike to build games for the 360, PC, or Zune. I'll be putting something together on this soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8821795236413349313-5459522409330502739?l=grifftownsend.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grifftownsend.blogspot.com/feeds/5459522409330502739/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8821795236413349313&amp;postID=5459522409330502739' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8821795236413349313/posts/default/5459522409330502739'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8821795236413349313/posts/default/5459522409330502739'/><link rel='alternate' type='text/html' href='http://grifftownsend.blogspot.com/2008/09/tvug-logo-submission-guidelines.html' title='TVUG Logo Submission Guidelines'/><author><name>Griff Townsend</name><uri>http://www.blogger.com/profile/12292628263957705552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp3.blogger.com/_wtz1ml2FXzY/SI8dYze_IjI/AAAAAAAAAAc/tYqX0kgCmyo/S220/head_shot_small.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8821795236413349313.post-15001503152038076</id><published>2008-09-10T06:38:00.000-07:00</published><updated>2008-09-10T07:32:23.236-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TVUG'/><title type='text'>TVUG Logo Contest</title><content type='html'>So, last night's presentation on the Entity Framework went well: I'll be posting the presentation and code samples to the &lt;a href="http://www.tvug.net/"&gt;TVUG site&lt;/a&gt; shortly. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One of the biggest announcements last night was the announcement of the TVUG Logo Contest! &lt;/div&gt;&lt;div&gt;We're accepting logo/site design submissions up until Tuesday, October 7th, 2008. You're not limited to color or design choices for our site, so stretch your imagination. The winner of the contest will receive a "goodie bag" of current release software (the contents of the kit are TBA, but I'm pretty sure we'll at least have a copy of VS 2008 to give away), and another portfolio piece when the new site rolls out. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To join, you need to be a registered member of TVUG (simply go to the website and &lt;a href="http://www.tvug.net/"&gt;register&lt;/a&gt;). The top 3 designs will be chosen by board members, and the winner will be chosen by the group in our October presentation (October 14th, 2008, topic TBA), and the plans for the site design will be implemented shortly after.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Good luck to all of you!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8821795236413349313-15001503152038076?l=grifftownsend.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grifftownsend.blogspot.com/feeds/15001503152038076/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8821795236413349313&amp;postID=15001503152038076' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8821795236413349313/posts/default/15001503152038076'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8821795236413349313/posts/default/15001503152038076'/><link rel='alternate' type='text/html' href='http://grifftownsend.blogspot.com/2008/09/tvug-logo-contest.html' title='TVUG Logo Contest'/><author><name>Griff Townsend</name><uri>http://www.blogger.com/profile/12292628263957705552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp3.blogger.com/_wtz1ml2FXzY/SI8dYze_IjI/AAAAAAAAAAc/tYqX0kgCmyo/S220/head_shot_small.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8821795236413349313.post-3614908126779401972</id><published>2008-09-03T17:32:00.000-07:00</published><updated>2008-09-03T17:40:03.626-07:00</updated><title type='text'>Fall 2008 Northeast Roadshow</title><content type='html'>&lt;p&gt;&lt;span style="font-size:85%;"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/cbowen/WindowsLiveWriter/AnnouncingtheFall2008NortheastRoadshow_11221/Roadshow-September-2008_2.png"&gt;&lt;img style="border-width: 0px;" alt="The Northeast Roadshow" src="http://blogs.msdn.com/blogfiles/cbowen/WindowsLiveWriter/AnnouncingtheFall2008NortheastRoadshow_11221/Roadshow-September-2008_thumb.png" width="464" border="0" height="99" /&gt;&lt;/a&gt;&lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="font-size:85%;"&gt;Join Microsoft's &lt;a href="http://blogs.msdn.com/cbowen/archive/2008/09/02/announcing-the-fall-2008-northeast-roadshow.aspx"&gt;Chris Bowen&lt;/a&gt; and &lt;a href="http://blogs.msdn.com/jimoneil/archive/2008/09/02/northeast-roadshow.aspx"&gt;Jim O'Neil&lt;/a&gt;  for a "free, relaxed day of deep content for developers and architects". Groovy!&lt;br /&gt;&lt;/span&gt;&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;&lt;strong&gt;Burlington, VT&lt;/strong&gt;:  September 23rd [&lt;a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032387791&amp;amp;culture=en-US"&gt;&lt;strong&gt;registration&lt;/strong&gt;&lt;/a&gt;]  &lt;em&gt;&lt;span style="color:#ff8000;"&gt;New Venue&lt;/span&gt; &lt;/em&gt;&lt;/span&gt; &lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;&lt;strong&gt;&lt;span style="color:#ff8000;"&gt;New City!&lt;/span&gt;&lt;/strong&gt; &lt;strong&gt;Albany,  NY&lt;/strong&gt;:  September 24th [&lt;a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032387792&amp;amp;culture=en-US"&gt;&lt;strong&gt;registration&lt;/strong&gt;&lt;/a&gt;]   &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;&lt;strong&gt;Rochester, NY&lt;/strong&gt;:  September 25th [&lt;a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032387794&amp;amp;culture=en-US"&gt;&lt;strong&gt;registration&lt;/strong&gt;&lt;/a&gt;]&lt;/span&gt;&lt;span style="font-size:85%;color:#ff8000;"&gt; &lt;em&gt;New Venue&lt;/em&gt;&lt;/span&gt;  &lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;&lt;strong&gt;Augusta, ME&lt;/strong&gt;:  October 3rd [&lt;a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032387795&amp;amp;culture=en-US"&gt;&lt;strong&gt;registration&lt;/strong&gt;&lt;/a&gt;]  &lt;em&gt;&lt;span style="color:#ff8000;"&gt;New Venue&lt;/span&gt;&lt;/em&gt;&lt;/span&gt;  &lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;&lt;strong&gt;Farmington, CT&lt;/strong&gt;:  October 14th [&lt;a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032387796&amp;amp;culture=en-US"&gt;&lt;strong&gt;registration&lt;/strong&gt;&lt;/a&gt;]   &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;&lt;strong&gt;Waltham, MA&lt;/strong&gt;:  October 15th [&lt;a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032387797&amp;amp;culture=en-US"&gt;&lt;strong&gt;registration&lt;/strong&gt;&lt;/a&gt;]   &lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:85%;"&gt;The agenda is as follows:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;table width="532" align="center" border="0" cellpadding="2" cellspacing="5"&gt;&lt;tbody&gt;&lt;tr&gt; &lt;td width="54" align="right"&gt;&lt;span style="font-size:85%;"&gt;8:30&lt;/span&gt;&lt;/td&gt; &lt;td width="465"&gt;&lt;span style="font-size:85%;"&gt;Registration&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="54" align="right"&gt;&lt;span style="font-size:85%;"&gt;9:00&lt;/span&gt;&lt;/td&gt; &lt;td width="465"&gt; &lt;div id="Session1"&gt;&lt;span style="font-size:85%;"&gt;Understanding the ADO.NET Entity Framework   &lt;/span&gt;  &lt;div style="display: none; cursor: text;"&gt; &lt;p&gt;Abstraction is frequently used to create difficult-to-appreciate artwork, but  when applied to software, abstractions can improve flexibility, independence,  and the ability to compose higher-level concepts. ADO.NET Entity Framework, now  shipping as part of Visual Studio 2008 &amp;amp; .NET 3.5 Service Pack 1, helps you  create models of your data that enable a familiar object-oriented programming  experience. Entities map flexibly to data sources while providing insulation  from schema changes at the same time. LINQ makes an appearance as well, using  the familiar syntax we’ve seen with LINQ to Objects, SQL, and XML to query  entities. You’ve got the picture, so get out there and model some works of  art!&lt;br /&gt; &lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="54" align="right"&gt;&lt;span style="font-size:85%;"&gt;10:30&lt;/span&gt;&lt;/td&gt; &lt;td width="465"&gt; &lt;div id="Session2"&gt;&lt;span style="font-size:85%;"&gt;Discovering Dynamic Data&lt;strong&gt;   &lt;/strong&gt;&lt;/span&gt;  &lt;div style="display: none; cursor: text;"&gt; &lt;p&gt;ASP.NET Dynamic Data, introduced with the .NET Framework 3.5 SP1 release,  breathes immediate (i.e., code-less) life into LINQ To SQL and Entity Framework  data models by providing a customizable, template-driven, scaffolding framework.  Put on your wizard hat, you now have dynamic power at your  fingertips&lt;strong&gt;.&lt;br /&gt;&lt;/strong&gt; &lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="54" align="right"&gt;&lt;span style="font-size:85%;"&gt;11:15&lt;/span&gt;&lt;/td&gt; &lt;td width="465"&gt; &lt;div id="Session3"&gt;&lt;span style="font-size:85%;"&gt;Exploring Internet Explorer 8&lt;strong&gt;   &lt;/strong&gt;&lt;/span&gt;  &lt;div style="display: none; cursor: text;"&gt; &lt;p&gt;Ahoy, developers! The release of Internet Explorer 8 is just around the bend.  Of course, we’ll pull out the spyglass and take a look over the sea of new  consumer features, but what does this next version mean for you as developer,  and what should you do to navigate to glory? You’ll see how treasures like  accelerators and web slices can be a differentiator for your company, see the  new wave of compatibility features and options, and unearth the tools available  for developers to make for smooth sailing on the sometimes turbulent web  development waters.&lt;br /&gt;  &lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="54" align="right"&gt;&lt;span style="font-size:85%;"&gt;12:00&lt;/span&gt;&lt;/td&gt; &lt;td width="465"&gt; &lt;div id="Session4"&gt;&lt;span style="font-size:85%;"&gt;RoboLunch   &lt;/span&gt;  &lt;div style="display: none; cursor: text;"&gt; &lt;p&gt;Grab a lunch and join in as we delve into the world of robotics programming  with Microsoft Robotics Developer Studio. Think robotics is mostly for  manufacturing systems, toys, and those cool little floor cleaning bots? You may  be surprised at how the things we cover may come to affect your professional  development life! Perhaps you’ll find yourself saying, "Thank you very  &lt;i&gt;luncho&lt;/i&gt;, Mr. Roboto!"&lt;br /&gt;&lt;strong&gt;  &lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="54" align="right"&gt;&lt;span style="font-size:85%;"&gt;1:00&lt;/span&gt;&lt;/td&gt; &lt;td width="465"&gt; &lt;div id="Session5"&gt;&lt;span style="font-size:85%;"&gt;UI, UX, U Confused?   &lt;/span&gt;  &lt;div style="display: none; cursor: text;"&gt; &lt;p&gt;One thing not missing from Microsoft’s development offerings is a choice of  options. In this session, we’ll compare and contrast the various .NET  technologies available for building client experiences (Windows Forms, WPF,  XBAP, ASP.NET, Silverlight, and Windows Mobile) to give you some insight in to  making the best choices for reaching your applications’ target audience.&lt;br /&gt;   &lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="54" align="right"&gt;&lt;span style="font-size:85%;"&gt;1:45&lt;/span&gt;&lt;/td&gt; &lt;td width="465"&gt; &lt;div id="Session6"&gt;&lt;span style="font-size:85%;"&gt;A RESTed Development   &lt;/span&gt;  &lt;div style="display: none; cursor: text;"&gt; &lt;p&gt;REST (Representational State Transfer) is what all the cool developers are  using these days to communicate among distributed resources and services.  So  that you’re not left standing idly by on the sidelines, we’ll look at the  rationales of the approach, why it’s cleaner than SOAP, and how Microsoft has  adopted REST in technologies such as WCF and ADO.NET Data Services.&lt;br /&gt;   &lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="54" align="right"&gt;&lt;span style="font-size:85%;"&gt;3:15&lt;/span&gt;&lt;/td&gt; &lt;td width="465"&gt; &lt;div id="Session7"&gt;&lt;span style="font-size:85%;"&gt;Befriending Unit Testing   &lt;/span&gt;  &lt;div style="display: none; cursor: text;"&gt; &lt;p&gt;Unit testing could be your new best friend, and we’re here to help make the  proper introductions. A practice that ultimately results in reduced overall  efforts, unit testing is a focus on crafting test code that verifies your  application code isn’t misbehaving. In this session, we’ll focus on what unit  testing is, how it can be done, and some of the proven and effective practices  you can employ to help your unit tests pay dividends over time. If Humphrey  Bogart were a developer, he would have agreed, this is the beginning of a  beautiful friendship.&lt;br /&gt;&lt;strong&gt;  &lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="54" align="right"&gt;&lt;span style="font-size:85%;"&gt;4:00&lt;/span&gt;&lt;/td&gt; &lt;td width="465"&gt;&lt;span style="font-size:85%;"&gt;Wrapup, Giveways, and Bon Voyage!&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;More details &lt;a href="http://blogs.msdn.com/cbowen/archive/2008/09/02/announcing-the-fall-2008-northeast-roadshow.aspx"&gt;here&lt;/a&gt; and &lt;a href="http://blogs.msdn.com/jimoneil/archive/2008/09/02/northeast-roadshow.aspx"&gt;here&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8821795236413349313-3614908126779401972?l=grifftownsend.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grifftownsend.blogspot.com/feeds/3614908126779401972/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8821795236413349313&amp;postID=3614908126779401972' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8821795236413349313/posts/default/3614908126779401972'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8821795236413349313/posts/default/3614908126779401972'/><link rel='alternate' type='text/html' href='http://grifftownsend.blogspot.com/2008/09/fall-2008-northeast-roadshow.html' title='Fall 2008 Northeast Roadshow'/><author><name>Griff Townsend</name><uri>http://www.blogger.com/profile/12292628263957705552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp3.blogger.com/_wtz1ml2FXzY/SI8dYze_IjI/AAAAAAAAAAc/tYqX0kgCmyo/S220/head_shot_small.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8821795236413349313.post-5126208980440880451</id><published>2008-09-03T17:02:00.000-07:00</published><updated>2008-09-03T17:07:30.903-07:00</updated><title type='text'>TVUG Presentation - September 9th</title><content type='html'>&lt;span style="font-weight: bold; color: rgb(51, 0, 153);font-size:130%;" &gt;&lt;span style="font-family:trebuchet ms;"&gt;Using the Entity Framework in .Net 3.5 SP1&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=";font-family:trebuchet ms;font-size:100%;"  &gt;--------------------------------------------------------------------------------&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:trebuchet ms;font-size:100%;"  &gt;&lt;span style="font-weight: bold;"&gt;Speaker&lt;/span&gt;: Griffith Townsend, MCP.Net, MCSE&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:trebuchet ms;font-size:100%;"  &gt;&lt;span style="font-weight: bold;"&gt;When&lt;/span&gt;: Tuesday September 9th, 2008 - 6:30-9PM&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:trebuchet ms;font-size:100%;"  &gt;&lt;span style="font-weight: bold;"&gt;Where&lt;/span&gt;: &lt;a href="http://www.mapquest.com/maps/map.adp?address=4%20British%20American%20Blvd&amp;amp;city=Latham&amp;amp;state=NY&amp;amp;zipcode=12110%2d1419&amp;amp;country=US&amp;amp;title=%3cspan%20style%3d%22margin%2dbottom%3a0px%3b%22%20class%3d%22adr%22%3e%3cb%20class%3d%22fn%20org%22%3eVersatrans%20Solutions%20Inc%3c%2fb%3e%3cbr%20%2f%3e%20%3cspan%20style%3d%22margin%2dbottom%3a0px%3b%22%20class%3d%22street%2daddress%22%3e4%20British%20American%20Blvd%20%23%202%3c%2fspan%3e%20%3cspan%20style%3d%22display%3ainline%3bmargin%2dbottom%3a0px%3b%22%20class%3d%22locality%22%3eLatham%3c%2fspan%3e%2c%20%3cspan%20style%3d%22display%3ainline%3bmargin%2dbottom%3a0px%3b%22%20class%3d%22region%22%3eNY%3c%2fspan%3e%20%3cspan%20style%3d%22display%3ainline%3bmargin%2dbottom%3a0px%3b%22%20class%3d%22postal%2dcode%22%3e12110%3c%2fspan%3e%2c%20%20%3cspan%20style%3d%22display%3ainline%3bmargin%2dbottom%3a0px%3b%22%20class%3d%22country%2dname%22%3eUS%3c%2fspan%3e%3c%2fspan%3e&amp;amp;cid=lfmaplink2&amp;amp;name=&amp;amp;dtype=s"&gt;VersaTrans Solutions, Latham, NY&lt;/a&gt; &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:trebuchet ms;font-size:100%;"  &gt;--------------------------------------------------------------------------------&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:trebuchet ms;font-size:100%;"  &gt;When developing multi-tiered applications, it’s not uncommon that to encounter code and architectural “noise” where a developer is forced to shift languages between the business logic layer and the data layer. The preference of many developers is the use of tools (typically Object Relational Mapping solutions) to abstract the database-specific aspects of the data layer into objects usable by the upper layers by object-oriented programming languages. &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:trebuchet ms;font-size:100%;"  &gt;Microsoft’s long awaited Entity Framework (EF) is one approach to raise the level of abstraction in complex applications, separating the logical object schema from the underlying data store. EF allows developers a lot of flexibility in creating and mapping database entities, relationships, functions, and procedures into either direct class translations or custom business entities. &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:trebuchet ms;font-size:100%;"  &gt;In this presentation, Griff Townsend introduces us to the Entity Framework as of its initial release in SP1, providing an architectural overview of EF, while also extending it into a working Data Layer. The presentation will also cover:&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Building your first EF model &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Using Stored Procedures and customizing business objects in the EF model &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Extending the Framework to support more robust data access &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:trebuchet ms;"&gt;LINQ to EF vs. LINQ to SQL &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Sharing Entities between layers&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8821795236413349313-5126208980440880451?l=grifftownsend.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grifftownsend.blogspot.com/feeds/5126208980440880451/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8821795236413349313&amp;postID=5126208980440880451' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8821795236413349313/posts/default/5126208980440880451'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8821795236413349313/posts/default/5126208980440880451'/><link rel='alternate' type='text/html' href='http://grifftownsend.blogspot.com/2008/09/tvug-presentation-september-9th.html' title='TVUG Presentation - September 9th'/><author><name>Griff Townsend</name><uri>http://www.blogger.com/profile/12292628263957705552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp3.blogger.com/_wtz1ml2FXzY/SI8dYze_IjI/AAAAAAAAAAc/tYqX0kgCmyo/S220/head_shot_small.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8821795236413349313.post-3324757095927881468</id><published>2008-08-29T11:19:00.000-07:00</published><updated>2008-09-03T06:46:35.665-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Entity Framework'/><title type='text'>A small extension to the Entity Framework</title><content type='html'>After my trials and tribulations with the Entity Framework that I posted last week, I thought I'd dig a little deeper and come up with a solid way to use Stored Procedures through the Entity Framework while maintaining the level of abstraction provided by EF.&lt;br /&gt;&lt;br /&gt;You may recall the problem: I have a user account table that stores confidential information that I don't want to directly expose to EF consumers, but I need to occasionally access it (user login, for instance) from the database. I could access it directly through a LINQ to SQL call or something similar, but I was looking for an efficient way to call it using EF.&lt;br /&gt;&lt;br /&gt;My first attempts were unsuccessful, as the Entity Wizard is nice enough to identify the stored procedures available from the database and add them to the entity schema, but it only generates methods signatures in the Entity class for procedures that return Entities or are able to map directly to Entities. Granted, this covers most CRUD work inside the db, but it won't cover everything. In my case:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The user account, when created, creates a password hash based on a unique salt value and the user's selected password. The hash and the salt values are then stored for any later comparisons, but there's no need for them to exist in any entities that come back to the consumer. A create login procedure, in this instance, doesn't map directly to an Entity (on purpose), but we still need to call the procedure if we want accounts created.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;In order to re-encrypt the password correctly on each login, the encryption algortihm needs to see the password salt that was entered when the user created the account. I could use a simple text query using the CreateQuery&lt;t&gt; method, but this would expose more of what I'm doing than I'd like. I'd much rather call an encrypted SP that does the processing for me, and returns the result as a string.&lt;/t&gt;&lt;/li&gt;&lt;/ul&gt;The basis for all data connections inside the Entity Framework is a set of classes contained in the System.Data.EntityClient namespace. If you've used the classes contained in the System.Data.Common namespace to execute stored procedures previously, you'll probably be happy to learn that all of the Entity based classes inherit this functionality.&lt;br /&gt;&lt;br /&gt;If you make an entity set using a process similar to what I discussed in my &lt;a href="http://grifftownsend.blogspot.com/2008/08/initial-observations-on-entity.html"&gt;last EF post&lt;/a&gt;, take a look at the base ObjectContext class created by the designer (it will have the same name as the name of your entity set). This ObjectContext is the manager between the database and the entities themselves. A Connection property in the ObjectContext exposes all we need to add some extension methods that will enable us to run non-entity based procedures while still maintaining the abstraction provided by the Entity Framework.&lt;br /&gt;&lt;br /&gt;Since our Entity data functionality extends System.Data.Common, I've got all I need:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Expose the EntityConnection using the ObjectContext.Connection.&lt;/li&gt;&lt;li&gt;The connection can run any function created in our Entity using the CreateCommand method of the EntityConnection.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;In order to access our stored procedures, we need to access them by using our Connection's store name, as well as the name of the imported function in the format StoreName.FunctionName.&lt;/li&gt;&lt;li&gt;The EntityCommand.CommandType must be set to CommandType.StoredProcedure.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;We need to either accept the passed in parameters (given that they're EntityParameters), convert them if they're DbParameters, or otherwise handle them.&lt;/li&gt;&lt;li&gt;The passed parameters need to be added to the command.&lt;/li&gt;&lt;li&gt;The command is then ready for the appropriate execution type.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;EntityCommand and DbCommand both have several different methods attached based on the type of stored procedure: my solution for this was to build a method that creates the EntityCommand (I called it &lt;span style="font-weight: bold; color: rgb(51, 102, 255);"&gt;CreateStoreCommand &lt;/span&gt;in the provided code sample), then run the correct method based on the procedure itself.&lt;br /&gt;&lt;br /&gt;&lt;!-- Code --&gt;&lt;pre&gt;&lt;br /&gt;&lt;div class="dp-highlighter" id="hlDiv"&gt;&lt;div class="bar"&gt;&lt;/div&gt;&lt;ol start="1" class="dp-c" style="margin-left:-10px;font-size:8pt;"&gt;&lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;static&lt;/span&gt;&lt;span&gt; EntityCommand CreateStoreCommand(ObjectContext context, &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; functionName, &lt;/span&gt;&lt;span class="keyword"&gt;object&lt;/span&gt;&lt;span&gt;[] parameters)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;{  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    EntityConnection entityConnection = (EntityConnection)context.Connection;  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    &lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; commandName = &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;.Format(&lt;/span&gt;&lt;span class="string"&gt;"{0}.{1}"&lt;/span&gt;&lt;span&gt;,context.DefaultContainerName,functionName);  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    EntityCommand entityCommand = entityConnection.CreateCommand();  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    entityCommand.CommandType = System.Data.CommandType.StoredProcedure;  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    entityCommand.CommandText = commandName;  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    &lt;span class="keyword"&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span class="keyword"&gt;null&lt;/span&gt;&lt;span&gt; != parameters &amp;amp;&amp;amp; parameters.Length &gt; 0)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    {  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        EntityParameter[] dbParams = &lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; EntityParameter[parameters.Length];  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        &lt;span class="keyword"&gt;if&lt;/span&gt;&lt;span&gt; (parameters &lt;/span&gt;&lt;span class="keyword"&gt;is&lt;/span&gt;&lt;span&gt; EntityParameter[])  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;            ((EntityParameter[])parameters).CopyTo(dbParams, 0);  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        }  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;        &lt;span class="keyword"&gt;else&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        {  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;            &lt;span class="keyword"&gt;for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span class="keyword"&gt;int&lt;/span&gt;&lt;span&gt; i = 0; i &amp;lt; parameters.Length; i++)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;            {  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;                EntityParameter p = &lt;span class="keyword"&gt;null&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;                &lt;span class="keyword"&gt;object&lt;/span&gt;&lt;span&gt; param = parameters[i];  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;                &lt;span class="keyword"&gt;if&lt;/span&gt;&lt;span&gt; (param &lt;/span&gt;&lt;span class="keyword"&gt;is&lt;/span&gt;&lt;span&gt; DbParameter)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;                {  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;                    DbParameter parm = (DbParameter)param;  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;                    p = (EntityParameter)parm;  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;                      &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;                }  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;                &lt;span class="keyword"&gt;else&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;if&lt;/span&gt;&lt;span&gt; (param &lt;/span&gt;&lt;span class="keyword"&gt;is&lt;/span&gt;&lt;span&gt; ObjectParameter)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;                {  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;                    p = entityCommand.CreateParameter();  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;                    ObjectParameter o = (ObjectParameter)param;  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;                    p.ParameterName = (o.Name.StartsWith(&lt;span class="string"&gt;"@"&lt;/span&gt;&lt;span&gt;)) ? o.Name.TrimStart(&lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;char&lt;/span&gt;&lt;span&gt;[] {&lt;/span&gt;&lt;span class="string"&gt;'@'&lt;/span&gt;&lt;span&gt;}) : o.Name;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;                    p.Value = o.Value;  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;                      &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;                }  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;                &lt;span class="keyword"&gt;else&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;                {  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;                    p = entityCommand.CreateParameter();  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;                    p.Value = parameters[i];  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;                }  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;                dbParams[i] = p;  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;            }  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;            entityCommand.Parameters.AddRange(dbParams);  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;        }  &lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    }  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    &lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span&gt; entityCommand;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;To utilize our EntityCommand, we'll build some extension methods for &lt;span style="font-weight: bold; color: rgb(51, 102, 255);font-family:lucida grande;"&gt;ObjectContext&lt;/span&gt;. If you're not familiar with extension methods, C# 3.5 allows us to extend prebuilt classes with custom code, and we can easily reuse this functionality by simply including this class in our projects. These functions are &lt;span style="font-weight: bold; color: rgb(51, 51, 255);font-family:lucida grande;"&gt;public static &lt;/span&gt;methods with a first parameter specified by the keyword &lt;span style="color: rgb(51, 102, 255);font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;this&lt;/span&gt;&lt;/span&gt;. For instance, if I want to extend the ObjectContext class directly to execute a scalar function from my database using a pre-existing stored procedure, I need to create a method like so:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;div class="dp-highlighter" id="hlDiv"&gt;&lt;div class="bar"&gt;&lt;/div&gt;&lt;ol start="1" class="dp-c" style="margin-left:-10px;"&gt;&lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;static&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;object&lt;/span&gt;&lt;span&gt; ExecuteScalar(&lt;/span&gt;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span&gt; ObjectContext context, &lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt; functionName, &lt;/span&gt;&lt;span class="keyword"&gt;params&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;object&lt;/span&gt;&lt;span&gt;[] parameters)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;{  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    &lt;span class="keyword"&gt;if&lt;/span&gt;&lt;span&gt; (context == &lt;/span&gt;&lt;span class="keyword"&gt;null&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class="keyword"&gt;null&lt;/span&gt;&lt;span&gt;;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;    EntityCommand command = CreateStoreCommand(context, functionName, parameters);  &lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;    &lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span&gt; command.ExecuteScalar();  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;}  &lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/pre&gt;&lt;br /&gt;I've got my scalar method. Note that the first parameter uses this to specify that this is an Extension method: if I include a reference to this class (or have the class in my namespace), any ObjectContext references will be able to execure these extensions:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_wtz1ml2FXzY/SLtQloSs0KI/AAAAAAAAABI/X5RSyF3awxQ/s1600-h/ExtensionScreen.png"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_wtz1ml2FXzY/SLtQloSs0KI/AAAAAAAAABI/X5RSyF3awxQ/s400/ExtensionScreen.png" alt="" id="BLOGGER_PHOTO_ID_5240871198776938658" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If you look at the tool tip in the photo above, you should be able to see that I can now cleanly access any function that I add to the EntitySet that I create. Since we're looking to hide the underlying data specifics (we leave the messy details to the .edmx file), this is intended behavior.&lt;br /&gt;&lt;br /&gt;I'll be posting a link to the &lt;a href="http://www.tvug.net/"&gt;TVUG&lt;/a&gt; site shortly for registered users, and I'll post a copy here when I'm able to.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8821795236413349313-3324757095927881468?l=grifftownsend.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grifftownsend.blogspot.com/feeds/3324757095927881468/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8821795236413349313&amp;postID=3324757095927881468' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8821795236413349313/posts/default/3324757095927881468'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8821795236413349313/posts/default/3324757095927881468'/><link rel='alternate' type='text/html' href='http://grifftownsend.blogspot.com/2008/08/small-extension-to-entity-framework.html' title='A small extension to the Entity Framework'/><author><name>Griff Townsend</name><uri>http://www.blogger.com/profile/12292628263957705552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp3.blogger.com/_wtz1ml2FXzY/SI8dYze_IjI/AAAAAAAAAAc/tYqX0kgCmyo/S220/head_shot_small.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_wtz1ml2FXzY/SLtQloSs0KI/AAAAAAAAABI/X5RSyF3awxQ/s72-c/ExtensionScreen.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8821795236413349313.post-3050319352738010258</id><published>2008-08-27T10:32:00.000-07:00</published><updated>2008-08-27T10:36:23.494-07:00</updated><title type='text'>Blog hiatus</title><content type='html'>There's been a small delay in my blogging this past week, due mostly to the birth of Gregory Thor Townsend, our third child. I'll put up more on this, and on a working way to use stored procedures easily with the Entity Framework by adding an Extension to EF.&lt;br /&gt;&lt;br /&gt;More on the way, including pictures of Greg, and some backstory on the choice of his middle name.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8821795236413349313-3050319352738010258?l=grifftownsend.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grifftownsend.blogspot.com/feeds/3050319352738010258/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8821795236413349313&amp;postID=3050319352738010258' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8821795236413349313/posts/default/3050319352738010258'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8821795236413349313/posts/default/3050319352738010258'/><link rel='alternate' type='text/html' href='http://grifftownsend.blogspot.com/2008/08/blog-hiatus.html' title='Blog hiatus'/><author><name>Griff Townsend</name><uri>http://www.blogger.com/profile/12292628263957705552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp3.blogger.com/_wtz1ml2FXzY/SI8dYze_IjI/AAAAAAAAAAc/tYqX0kgCmyo/S220/head_shot_small.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8821795236413349313.post-2484849327171097940</id><published>2008-08-19T07:33:00.001-07:00</published><updated>2008-08-19T13:40:54.912-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Entity Framework'/><title type='text'>Initial Observations on the Entity Framework</title><content type='html'>After spending a few hours getting acquainted with the Entity Framework (EF) in VS/C# SP1, I've got a few things that I'd like to discuss. In all, I find EF to be a very robust, mostly flexible framework that allows developers to create an ORM data layer very quickly with what seems to be little overhead.&lt;br /&gt;&lt;br /&gt;To give you an idea of my tests, I built a simple yet modular db for multiple types of related web applications. For instance, if you are looking at a blog, a forum/announcement board, or &lt;a href="http://www.flickr.com/"&gt;Flickr&lt;/a&gt;, you're looking at three seemingly disparate applications that have a lot of the same elements in implementation (comments, keywords/tags, and categories, for instance).&lt;br /&gt;&lt;br /&gt;With this in mind, consider the following structure:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_wtz1ml2FXzY/SKrhNwJ36xI/AAAAAAAAAAw/r6qnidpBUrU/s1600-h/SimpleERD.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_wtz1ml2FXzY/SKrhNwJ36xI/AAAAAAAAAAw/r6qnidpBUrU/s400/SimpleERD.png" alt="" id="BLOGGER_PHOTO_ID_5236245143152487186" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Yes, it's very basic, but we're not going overboard on this example. I can take this database, and create an EntitySet similar to the following using the built in wizard:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_wtz1ml2FXzY/SKrh5SwRvdI/AAAAAAAAAA4/ToVGB0bTCzo/s1600-h/Simple_EntityDesignerDiagram.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_wtz1ml2FXzY/SKrh5SwRvdI/AAAAAAAAAA4/ToVGB0bTCzo/s400/Simple_EntityDesignerDiagram.png" alt="" id="BLOGGER_PHOTO_ID_5236245891174743506" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;This was extremely easy, and took a few short steps:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;From your project, &lt;span style="font-weight: bold;font-family:courier new;" &gt;Add &gt;New Item &gt; ADO.Net Entity Diagram&lt;/span&gt;. You will only see this option once SP1 is installed if you haven't installed any of the EF Betas or CTFs.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;In the Entity Data Model Wizard, pick the &lt;span style="font-weight: bold;font-family:courier new;" &gt;Add &gt;New Item &gt;Generate from database&lt;/span&gt; option.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;A choose your data connection option will appear: either add the db to your project, or add a standard db connection (I'll revise this later if you need to learn the steps to connect to a db, just ask).&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Choose all the Tables, Views, and Stored Procedures that you wish to add.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Click &lt;span style="font-weight: bold;"&gt;Finish&lt;/span&gt;, and enjoy your new Entity Model (ModelName.edmx in your project).&lt;/li&gt;&lt;/ol&gt;So far, things are pretty clean, but I noticed a few gotchas while working with a slightly more complex model:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;If you've used any of the EF betas and are looking for the CSDL, MSL, and SSDL files, they are all parts of the .edmx structure&lt;/span&gt;. The all in one format is quite a bit easier to manage file-wise (and it makes sense), but it is a little more cumbersome to edit by hand (the corresponding portions of the XML are identified with comments, so it's not a big deal).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Entities have trouble being created without keys, and a simple db design error can set you back quickly.&lt;/span&gt; If I were to add a BlogCommentID column as an identity column for the BlogComment table (a so- so- practice, but not uncommon one), it would have to exist in the created Entity (If I want to be able to access the Entity directly).&lt;br /&gt;&lt;br /&gt;In one of my initial passes with EF, I had incorrectly mapped the FK from Blog-BlogComment (I went from BlogID-&gt;CommentID, not BlogID-&gt;BlogID). The EF Wizard allowed this relationship, but didn't allow the valid one to process. Manually adjusting the edmx was an experience, but it worked, at least until I tried to add any new db elements. The automated update Entities from Database process overwrote my changes each time, and it was a real mess.&lt;br /&gt;&lt;br /&gt;Of course, the error was my own as far as the relationship in the database, but I have a feeling that purist db design is unfortunately the exception rather than the norm in companies that have been out there for quite a while, and the second that you figure a workaround, it's potentially a breaking change every time you update your schema.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Stored Procedure support is really nice, but can be cumbersome, as you have to create Entities for all stored procedures that return column subsets, unless you start to add null support for all non-important columns in your entities&lt;/span&gt;. For instance, if I want BlogTitles for category, I'd usually add a stored procedure that did the dirty work, then make a SQLcommand call that returns an untyped DataSet with my values. The Entity Framework does provide Entity versions of the same classes, but we're using the Entity Framework for data abstraction, so I'd rather have a GetBlogTitlesByCategory that returns a strongly typed class structure built for me. These strongly typed classes need to be added as Entities to the edmx so that they can be effectively mapped to the stored procedure.&lt;br /&gt;&lt;br /&gt;It makes sense why this step is necessary (you can't determine data types for columns by looking directly at a stored procedure), but the frustrating portion is that these procedures might be added as function calls into the edmx file (and visible in your schema), but no actual method is created because the Entity return values are not created by the Wizard. You will not see the actual method definitions in the generated classes until you add the Entity(-ies) into your edmx, or you map the return value of the stored procedure to existing Entities (hence the need for nullable support, as the blog example would return blogid, title, and the create date, but not necessarily the body of the blog).   A code generation tool for this would be nice, but converting a pre-existing data structure over to EF could turn into a painful exercise (but may help you refactor out similar procedures).&lt;br /&gt;&lt;br /&gt;I'll give you another example of the problem: an account table stores a password salt, username, and password hash values. The user, when logging in, passes in the username and password. The business logic of the app takes the password and the salt, and creates the password hash value, and the Account Entity is returned if the username, hash, and salt values all match. I want the actual hashing algorithm independent of the db, but the db will store the salt, which is generated when the account is created. I don't want the Account Entity to contain the Hash or Salt values when the Account is returned, but I also want them to be required on the DB side. All I have to do on the Entity side is delete the autogenerated hash and salt columns, and they are not available for use.&lt;br /&gt;&lt;br /&gt;The problem comes when we need to get the salt from the db in order to hash up the password when the user logs in. I have a stored procedure that will return the appropriate salt value in a one row, one column select statement, but I have to create an entity to get the value, and I get an entity back, when all I need is a single string! I tried mapping the function to a scalar, but that required re-writing the stored procedure to fit (not a good option for pre-existing sp's). I've tried setting ReturnType="Collection(String)" in the FunctionImport tag, but the entity designer doesn't create the method for me.&lt;br /&gt;&lt;br /&gt;Of course, there's always LINQ to Entities, but I'm not sure that the LINQ query:&lt;br /&gt;&lt;br /&gt;string passSalt = (from a in entity.Account&lt;br /&gt;                                 where a.Username == username&lt;br /&gt;                                 select a.PasswordSalt).First();&lt;br /&gt;&lt;br /&gt;Or similar is more efficient(Keep in mind LINQ queries are designed to return a collection, not a scalar, so there's an additional level of processing to get the required value in this instance - the First method), and it forces me to keep at least the PasswordSalt in the return set.&lt;br /&gt;&lt;br /&gt;I'm sure that I've missed something in my searching, or am simply expecting too much from the first production iteration of EF, but it would make sense that the Stored Procedure return values conundrum be just a little better documented in MSDN.&lt;br /&gt;&lt;br /&gt;I'll be doing quite a bit more with EF over the next few weeks, and despite the hurdles, I can't help but like the abstraction that is created with EF, and I feel that it will make app scaling and changing schemas MUCH nicer (in relation to straight DB mapping, not other ORM tools), as long as the EF is flexible enough to fit the DB in its current state without too much effort.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8821795236413349313-2484849327171097940?l=grifftownsend.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grifftownsend.blogspot.com/feeds/2484849327171097940/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8821795236413349313&amp;postID=2484849327171097940' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8821795236413349313/posts/default/2484849327171097940'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8821795236413349313/posts/default/2484849327171097940'/><link rel='alternate' type='text/html' href='http://grifftownsend.blogspot.com/2008/08/initial-observations-on-entity.html' title='Initial Observations on the Entity Framework'/><author><name>Griff Townsend</name><uri>http://www.blogger.com/profile/12292628263957705552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp3.blogger.com/_wtz1ml2FXzY/SI8dYze_IjI/AAAAAAAAAAc/tYqX0kgCmyo/S220/head_shot_small.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_wtz1ml2FXzY/SKrhNwJ36xI/AAAAAAAAAAw/r6qnidpBUrU/s72-c/SimpleERD.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8821795236413349313.post-3913182378024009710</id><published>2008-08-15T07:02:00.000-07:00</published><updated>2008-08-18T07:25:45.288-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='about me'/><category scheme='http://www.blogger.com/atom/ns#' term='intro'/><title type='text'>About me</title><content type='html'>Hi, all, welcome to my blog. I'm hoping that this post will actually make it to the publish phase, as it is my 3rd or 4th attempt at putting something up here in the 3 weeks since I created this account. Since I'm ramping up my speaking engagements over the next few months, I really should have a voice other than the one that .Net developers in the Albany, NY area have listened to for the past few years.&lt;br /&gt;&lt;br /&gt;About me - My name is Griff, and I like to code. I first decided that I liked to code when I was about 13, working in BASIC on an Atari 400 (then an 800XL -&gt; WOOT), legal pad at my side with the actual lines of code that I would have to retype each time I turned the computer on because a floppy drive was $250 at the time, and I was a kid with an allowance a lot less than that. I had opened up the world of computing, and there was no limit to where I could go.&lt;br /&gt;&lt;br /&gt;Then, puberty hit, and about ten years passed.&lt;br /&gt;&lt;br /&gt;In the early '90s, I found myself disillusioned with college (I was an Econ major, no idea why) and in a band. The band was a blast, but we were self-marketed, and I found myself needing to teach myself Photoshop so that I could make flyers for the band. It was around that point that Netscape 1.1 was released, and I realized that computers were my bag, baby.&lt;br /&gt;&lt;br /&gt;Long story short, I've been programming, first as a hobbyist, then professionally, for over 15 years. I got an MCP.Net a while ago, but I've really focused more on diving into and working in the technologies than expanding the number of commas after my name the past few years. I've done both the Web- and Windows- side of things, and have about 8 years of teaching and speaking experience (&lt;a href="http://www.cbit.syr.edu/"&gt;Syracuse University&lt;/a&gt; and occasionally &lt;a href="http://www.itt-tech.edu/"&gt;ITT Tech&lt;/a&gt;) tied in with the development work. I'm currently the President of the &lt;a href="http://www.tvug.net/"&gt;Tech Valley .Net Users Group&lt;/a&gt;, and an avid gamer.&lt;br /&gt;&lt;br /&gt;While most of my focus for this blog will be riffs on .Net development (C#, .Net 3.5, &lt;a href="http://creators.xna.com/"&gt;XNA&lt;/a&gt;, etc), I reserve the right to also talk about family, friends, games, football, or anything else that comes to mind. I may pop into teaching mode, or talk about new stuff that I'm learning. My focus will be on posting twice a week (I'm thinking Tuesday and Friday) on something that is at least a little interesting.&lt;br /&gt;&lt;br /&gt;That all said and done, stay tuned.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8821795236413349313-3913182378024009710?l=grifftownsend.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://grifftownsend.blogspot.com/feeds/3913182378024009710/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8821795236413349313&amp;postID=3913182378024009710' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8821795236413349313/posts/default/3913182378024009710'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8821795236413349313/posts/default/3913182378024009710'/><link rel='alternate' type='text/html' href='http://grifftownsend.blogspot.com/2008/08/about-me.html' title='About me'/><author><name>Griff Townsend</name><uri>http://www.blogger.com/profile/12292628263957705552</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp3.blogger.com/_wtz1ml2FXzY/SI8dYze_IjI/AAAAAAAAAAc/tYqX0kgCmyo/S220/head_shot_small.jpg'/></author><thr:total>2</thr:total></entry></feed>
