Let’s continue on from the previous 3 posts about the entity framework:
I keep addressing the need to have intuitive code. You’ll see shortly that our code is going to look pretty sweet, thanks to the ADO.NET Entity Framework.
We’re going to write code that reads from our context object from the Entity Framework. Our code this time around will loop through parent and child entities. That is the main lesson here.
If you’ve been reading the previous posts, we’ve been building up a WPF application. Here is the source code in case you haven’t seen the other posts. It will be much easier if you just build up the database from the model as my posts describe. You’ll have a much better understanding of how the pieces fit together.
http://brunoblogfiles.com/zips/DemoFeatures2.zip
Here is the database code for BlogDB. If you followed the previous posts, you won’t need this script. Otherwise, open up SQL Server Management Studio 2008 and run this script.
USE [master]
GO
/****** Object: Database [BlogDB] Script Date: 02/01/2010 15:20:23 ******/
IF EXISTS (SELECT name FROM sys.databases WHERE name = N'BlogDB')
DROP DATABASE [BlogDB]
CREATE DATABASE [BlogDB] ON PRIMARY
( NAME = N'BlogDB', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\BlogDB.mdf' , SIZE = 2304KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
LOG ON
( NAME = N'BlogDB_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\BlogDB_log.LDF' , SIZE = 768KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
ALTER DATABASE [BlogDB] SET COMPATIBILITY_LEVEL = 100
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [BlogDB].[dbo].[sp_fulltext_database] @action = 'enable'
end
ALTER DATABASE [BlogDB] SET ANSI_NULL_DEFAULT OFF
ALTER DATABASE [BlogDB] SET ANSI_NULLS OFF
ALTER DATABASE [BlogDB] SET ANSI_PADDING OFF
ALTER DATABASE [BlogDB] SET ANSI_WARNINGS OFF
ALTER DATABASE [BlogDB] SET ARITHABORT OFF
ALTER DATABASE [BlogDB] SET AUTO_CLOSE OFF
ALTER DATABASE [BlogDB] SET AUTO_CREATE_STATISTICS ON
ALTER DATABASE [BlogDB] SET AUTO_SHRINK OFF
ALTER DATABASE [BlogDB] SET AUTO_UPDATE_STATISTICS ON
ALTER DATABASE [BlogDB] SET CURSOR_CLOSE_ON_COMMIT OFF
ALTER DATABASE [BlogDB] SET CURSOR_DEFAULT GLOBAL
ALTER DATABASE [BlogDB] SET CONCAT_NULL_YIELDS_NULL OFF
ALTER DATABASE [BlogDB] SET NUMERIC_ROUNDABORT OFF
ALTER DATABASE [BlogDB] SET QUOTED_IDENTIFIER OFF
ALTER DATABASE [BlogDB] SET RECURSIVE_TRIGGERS OFF
ALTER DATABASE [BlogDB] SET ENABLE_BROKER
ALTER DATABASE [BlogDB] SET AUTO_UPDATE_STATISTICS_ASYNC OFF
ALTER DATABASE [BlogDB] SET DATE_CORRELATION_OPTIMIZATION OFF
ALTER DATABASE [BlogDB] SET TRUSTWORTHY OFF
ALTER DATABASE [BlogDB] SET ALLOW_SNAPSHOT_ISOLATION OFF
ALTER DATABASE [BlogDB] SET PARAMETERIZATION SIMPLE
ALTER DATABASE [BlogDB] SET READ_COMMITTED_SNAPSHOT OFF
ALTER DATABASE [BlogDB] SET HONOR_BROKER_PRIORITY OFF
ALTER DATABASE [BlogDB] SET READ_WRITE
ALTER DATABASE [BlogDB] SET RECOVERY FULL
ALTER DATABASE [BlogDB] SET MULTI_USER
ALTER DATABASE [BlogDB] SET PAGE_VERIFY CHECKSUM
ALTER DATABASE [BlogDB] SET DB_CHAINING OFF
USE [BlogDB]
/****** Object: Table [dbo].[Tags] Script Date: 02/01/2010 15:22:11 ******/
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Tags]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[Tags](
[Id] [int] NOT NULL,
[Name] [nvarchar](max) NOT NULL,
CONSTRAINT [PK_Tags] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
END
/****** Object: Table [dbo].[Blogs] Script Date: 02/01/2010 15:22:11 ******/
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Blogs]') AND type in (N'U'))
CREATE TABLE [dbo].[Blogs](
[Owner] [nvarchar](max) NOT NULL,
CONSTRAINT [PK_Blogs] PRIMARY KEY CLUSTERED
INSERT [dbo].[Blogs] ([Id], [Name], [Owner]) VALUES (1, N'Blog about developing software', N'Bruno Terkaly')
/****** Object: Table [dbo].[Posts] Script Date: 02/01/2010 15:22:11 ******/
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Posts]') AND type in (N'U'))
CREATE TABLE [dbo].[Posts](
[CreatedDate] [datetime] NOT NULL,
[ModifiedDate] [datetime] NOT NULL,
[PostContent] [nvarchar](max) NOT NULL,
[Title] [nvarchar](max) NOT NULL,
[BlogId] [int] NOT NULL,
CONSTRAINT [PK_Posts] PRIMARY KEY CLUSTERED
INSERT [dbo].[Posts] ([Id], [CreatedDate], [ModifiedDate], [PostContent], [Title], [BlogId]) VALUES (1, CAST(0x00009D0E003D691A AS DateTime), CAST(0x00009D0E003D691B AS DateTime), N'Read this blog post by Bruno', N'Learning ADO.NET Entity Framework - Intro', 1)
INSERT [dbo].[Posts] ([Id], [CreatedDate], [ModifiedDate], [PostContent], [Title], [BlogId]) VALUES (2, CAST(0x00009D0E003D694E AS DateTime), CAST(0x00009D0E003D694E AS DateTime), N'Read this blog post by Bruno', N'Learning ADO.NET Entity Framework - Advanced Topics', 1)
/****** Object: Table [dbo].[PostTag] Script Date: 02/01/2010 15:22:11 ******/
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[PostTag]') AND type in (N'U'))
CREATE TABLE [dbo].[PostTag](
[Posts_Id] [int] NOT NULL,
[Tags_Id] [int] NOT NULL,
CONSTRAINT [PK_PostTag] PRIMARY KEY NONCLUSTERED
[Posts_Id] ASC,
[Tags_Id] ASC
/****** Object: ForeignKey [FK_PostTag_Post] Script Date: 02/01/2010 15:22:11 ******/
IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_PostTag_Post]') AND parent_object_id = OBJECT_ID(N'[dbo].[PostTag]'))
ALTER TABLE [dbo].[PostTag] WITH NOCHECK ADD CONSTRAINT [FK_PostTag_Post] FOREIGN KEY([Posts_Id])
REFERENCES [dbo].[Posts] ([Id])
IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_PostTag_Post]') AND parent_object_id = OBJECT_ID(N'[dbo].[PostTag]'))
ALTER TABLE [dbo].[PostTag] CHECK CONSTRAINT [FK_PostTag_Post]
/****** Object: ForeignKey [FK_PostTag_Tag] Script Date: 02/01/2010 15:22:11 ******/
IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_PostTag_Tag]') AND parent_object_id = OBJECT_ID(N'[dbo].[PostTag]'))
ALTER TABLE [dbo].[PostTag] WITH NOCHECK ADD CONSTRAINT [FK_PostTag_Tag] FOREIGN KEY([Tags_Id])
REFERENCES [dbo].[Tags] ([Id])
IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_PostTag_Tag]') AND parent_object_id = OBJECT_ID(N'[dbo].[PostTag]'))
ALTER TABLE [dbo].[PostTag] CHECK CONSTRAINT [FK_PostTag_Tag]
/****** Object: ForeignKey [FK_BlogPost] Script Date: 02/01/2010 15:22:11 ******/
IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_BlogPost]') AND parent_object_id = OBJECT_ID(N'[dbo].[Posts]'))
ALTER TABLE [dbo].[Posts] WITH NOCHECK ADD CONSTRAINT [FK_BlogPost] FOREIGN KEY([BlogId])
REFERENCES [dbo].[Blogs] ([Id])
IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_BlogPost]') AND parent_object_id = OBJECT_ID(N'[dbo].[Posts]'))
ALTER TABLE [dbo].[Posts] CHECK CONSTRAINT [FK_BlogPost]
We will need to do the following:
Right mouse click on your project and select “Add / New Folder”
We will now add an image to the images folder.
http://brunoblogfiles.com/images/WindowBackground.png
You’ll need the folder path to your image to complete the next step:
Add an “Existing Item.”
Select the image. You can download my copy here.
Finally, we have the “Images” folder ready with the image.
I will make the project up this point available here. Teaching the basic skill of dragging a button to the form is not in scope for this tutorial.
http://brunoblogfiles.com/zips/DemoFeatures3.zip
By now it should be obvious to anyone that has followed the last several posts that our entity data is always based on relational data. This is a quick detour back to SQL Server Management Studio 2008 that shows how to add database diagrams with a few mouse clicks.
We would like to see all the relationships so we’ll select all the tables.
Note the following:
Hopefully you learned a few more things when working with the ADO.NET Entity Framework: