This presentataion slide describes Microsoft.NET Framework 4 ADO.NET Entity Framework and was used for VSUG Day 2010 Summer in Japan.
VSUG (Visual Studio Users Group)
VSUG Day 2010 Summer - Using ADO.NET Entity Framework
1. VSUG DAY 2010 Summer
ADO.NET Entity Framework
を使いこなそう
福井 厚 ( Twitter: @afukui )
VSUG運営委員
Microsoft Certified Architect
Microsoft Regional Director
Microsoft MVP for Visual C#
2. 自己紹介
福井 厚 (ふくい あつし)
アバナード株式会社
Group Manager / CTO Architect
Visual Studio User Group 運営委員
Microsoft Certified Architect (MCA)
Microsoft Regional Director
Microsoft MVP for Visual Developer – C#
Blog: http://www.users.gr.jp/blogs/fukui/
Twitter: @afukui
VSUG DAY 2010.05.09
13. Entity Data Model の概念
エンティティ型
Entity Data Model でデータ構造を記述するために不可欠な構成要素
継承をサポート
アソシエーション型
Entity Data Model でリレーションシップを記述するために不可欠な構
成要素
アソシエーションに含まれるエンティティ型を指定する 2 つのアソシ
エーション End がある
アソシエーションのその End に存在できるエンティティ数を示すアソ
シエーション End の多重度も指定する必要がある
プロパティ
エンティティ型には、その構造と特性を定義するプロパティが含まれる
プロパティには、プリミティブ データ (文字列、整数、ブール値など) または構
造化データ (複合型) を含めることができる
VSUG DAY 2010.05.09
25. LINQ to Entities
メソッドベースの構文例(射影)
using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
var query = AWEntities.Products
.Select(product => new
{
ProductId = product.ProductID,
ProductName = product.Name
});
Console.WriteLine("Product Info:");
foreach (var productInfo in query)
{
Console.WriteLine("Product Id: {0} Product name: {1} ",
productInfo.ProductId, productInfo.ProductName);
}
}
VSUG DAY 2010.05.09
26. LINQ to Entities
クエリ式の構文例(射影)
using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
ObjectSet<Product> products = AWEntities.Products;
IQueryable<Product> productsQuery = from product in products
select product;
Console.WriteLine("Product Names:");
foreach (var prod in productsQuery)
{
Console.WriteLine(prod.Name);
}
}
VSUG DAY 2010.05.09
27. LINQ to Entities
クエリ式の構文例(フィルター処理)
ObjectSet<SalesOrderHeader> orders = AWEntities.SalesOrderHeaders;
var onlineOrders =
from order in orders
where order.OnlineOrderFlag == true
select new
{
SalesOrderID = order.SalesOrderID,
OrderDate = order.OrderDate,
SalesOrderNumber = order.SalesOrderNumber
};
VSUG DAY 2010.05.09
28. LINQ to Entities
クエリ式の構文例(集計演算子処理)
ObjectSet<Product> products = AWEntities.Products;
var query = from product in products
group product by product.Style into g
select new
{
Style = g.Key,
AverageListPrice =
g.Average(product => product.ListPrice)
};
foreach (var product in query)
{
Console.WriteLine("Product style: {0} Average list price: {1}",
product.Style, product.AverageListPrice);
}
VSUG DAY 2010.05.09
29. LINQ to Entities
クエリ式の構文例(パーティション分割)
var query = (from album in albums
where album.Artist.Name == "Deep Purple"
orderby album.Title
select new
{
Title = album.Title,
Name = album.Artist.Name
}).Take(3);
VSUG DAY 2010.05.09
30. LINQ to Entities
クエリ式の構文例(結合演算子)
GroupJoin() 左外部結合に相当
var query =
from contact in contacts
join order in orders
on contact.ContactID
equals order.Contact.ContactID into contactGroup
select new
{
ContactID = contact.ContactID,
OrderCount = contactGroup.Count(),
Orders = contactGroup.Select(order => order)
};
VSUG DAY 2010.05.09
31. LINQ to Entities
クエリ式の構文例(グループ化)
var query = (
from contact in contacts
group contact by contact.LastName.Substring(0, 1) into contactGroup
select new { FirstLetter = contactGroup.Key,
ContactGroup = contactGroup }).
OrderBy(letter => letter.FirstLetter);
foreach (var contact in query)
{
Console.WriteLine("Last names that start with the letter '{0}':",
contact.FirstLetter);
foreach (var name in contact.ContactGroup)
{
Console.WriteLine(name.LastName);
}
}
VSUG DAY 2010.05.09
37. オブジェクトの作成と追加
using (ChinookEntities context = new ChinookEntities())
{
ObjectSet<Artist> artists = context.Artists;
//ArtistIdはIdentityとして宣言されているので、初期値(0)は無視される
Artist artist = Artist.CreateArtist(0);
artist.Name = "Atsushi Fukui";
artists.AddObject(artist);
context.SaveChanges();
Console.WriteLine("Added Artist id {0} name {1}", artist.ArtistId, artist.Name);
VSUG DAY 2010.05.09
38. オブジェクトの削除
using (ChinookEntities context = new ChinookEntities())
{
ObjectSet<Artist> artists = context.Artists;
Artist artist = artists.Where("it.Name=@name",
new ObjectParameter("name", "Atsushi Fukui")).First();
if (artist != null)
{
artists.DeleteObject(artist);
context.SaveChanges();
}
}
VSUG DAY 2010.05.09
39. オブジェクトの更新
object entity = null;
IEnumerable<KeyValuePair<string, object>> keyValues =
new KeyValuePair<string, object>[]{
new KeyValuePair<string, object>("ArtistId", 279)
};
EntityKey key = new EntityKey("ChinookEntities.Artists", keyValues);
if (context.TryGetObjectByKey(key, out entity))
{
Artist artist = (Artist)entity;
artist.Name = "Hideharu Moriya";
context.SaveChanges();
}
Artist a = context.Artists.Where(o => o.ArtistId == 279).First();
if (a != null)
{
Console.WriteLine(“artist id {0}, name {1}”, a.ArtistId, a.Name);
}
VSUG DAY 2010.05.09
50. 自動生成されるSQLの一部
-- Creating table 'Parties'
CREATE TABLE [dbo].[Parties] (
[Id] int IDENTITY(1,1) NOT NULL,
[Name] nvarchar(max) NOT NULL
);
GO
-- Creating table 'Parties_Organization'
CREATE TABLE [dbo].[Parties_Organization] (
[Location] nvarchar(max) NOT NULL,
[Id] int NOT NULL
);
GO
-- Creating table 'Parties_Person'
CREATE TABLE [dbo].[Parties_Person] (
[Age] int NOT NULL,
[Id] int NOT NULL
);
GO
VSUG DAY 2010.05.09