public OrdersContext() : base("name=OrdersContext")Add the following properties to the OrdersContext class:
將以下屬性添加到OrdersContext類(lèi):
代碼如下:
public DbSet<Order> Orders { get; set; }
public DbSet<OrderDetail> OrderDetails { get; set; }
A DbSet represents a set of entities that can be queried. Here is the complete listing for the OrdersContext class:
DbSet表示一組能夠被查詢(xún)的實(shí)體。以下是這個(gè)OrdersContext類(lèi)的完整清單:
代碼如下:
public class OrdersContext : DbContext
{
public OrdersContext() : base("name=OrdersContext")
{
}
public DbSet<Order> Orders { get; set; }
public DbSet<OrderDetail> OrderDetails { get; set; }
public DbSet<Product> Products { get; set; }
}
The AdminController class defines five methods that implement basic CRUD functionality. Each method corresponds to a URI that the client can invoke:
類(lèi)定義了實(shí)現(xiàn)基本的CRUD功能的五個(gè)方法。每個(gè)方法對(duì)應(yīng)于一個(gè)客戶(hù)端可以請(qǐng)求的URI(見(jiàn)表2-2):
表2-2. AdminController中實(shí)現(xiàn)CRUD操作的五個(gè)方法
table
Each method calls into OrdersContext to query the database. The methods that modify the collection (PUT, POST, and DELETE) call db.SaveChanges to persist the changes to the database. Controllers are created per HTTP request and then disposed, so it is necessary to persist changes before a method returns.
每一個(gè)方法調(diào)用都會(huì)進(jìn)入OrdersContext對(duì)數(shù)據(jù)庫(kù)進(jìn)行查詢(xún)。對(duì)數(shù)據(jù)集進(jìn)行修改的方法(PUT、POST以及DELETE)會(huì)調(diào)用db.SaveChanges,以便把這些修改持久化回?cái)?shù)據(jù)庫(kù)。每個(gè)HTTP請(qǐng)求都會(huì)創(chuàng)建控制器(實(shí)例),然后清除它。因此,在一個(gè)方法返回之前,對(duì)修改持久化是必要的。
Add a Database Initializer
添加數(shù)據(jù)庫(kù)初始化器
Entity Framework has a nice feature that lets you populate the database on startup, and automatically recreate the database whenever the models change. This feature is useful during development, because you always have some test data, even if you change the models.
實(shí)體框架有一個(gè)很好的特性,它讓你在(應(yīng)用程序)啟動(dòng)時(shí)填充數(shù)據(jù)庫(kù),并在模型發(fā)生修改時(shí)重建數(shù)據(jù)庫(kù)。這個(gè)特性在開(kāi)發(fā)期間是有用的,因?yàn)槟憧倳?huì)有一些測(cè)試數(shù)據(jù),甚至?xí)薷哪P汀?
In Solution Explorer, right-click the Models folder and create a new class named OrdersContextInitializer. Paste in the following implementation:
在“解決方案資源管理器”中,右擊Models文件夾,并創(chuàng)建一個(gè)名稱(chēng)為OrdersContextInitializer的新類(lèi)。粘貼以下實(shí)現(xiàn):
代碼如下:
namespace ProductStore.Models
{
using System;
using System.Collections.Generic;
using System.Data.Entity;
public class OrdersContextInitializer : DropCreateDatabaseIfModelChanges<OrdersContext>
{
protected override void Seed(OrdersContext context)
{
var products = new List<Product>()
{
new Product() { Name = "Tomato Soup", Price = 1.39M, ActualCost = .99M },
new Product() { Name = "Hammer", Price = 16.99M, ActualCost = 10 },
new Product() { Name = "Yo yo", Price = 6.99M, ActualCost = 2.05M }
};
products.ForEach(p => context.Products.Add(p));
context.SaveChanges();
var order = new Order() { Customer = "Bob" };
var od = new List<OrderDetail>()
{
new OrderDetail() { Product = products[0], Quantity = 2, Order = order},
new OrderDetail() { Product = products[1], Quantity = 4, Order = order }
};
context.Orders.Add(order);
od.ForEach(o => context.OrderDetails.Add(o));
context.SaveChanges();
}
}
}
By inheriting from the DropCreateDatabaseIfModelChanges class, we are telling Entity Framework to drop the database whenever we modify the model classes. When Entity Framework creates (or recreates) the database, it calls the Seed method to populate the tables. We use the Seed method to add some example products plus an example order.
通過(guò)對(duì)DropCreateDatabaseIfModelChanges類(lèi)的繼承,我們是在告訴實(shí)體框架,無(wú)論何時(shí)修改了模型類(lèi),便刪除數(shù)據(jù)庫(kù)。當(dāng)實(shí)體框架創(chuàng)建(或重建)數(shù)據(jù)庫(kù)時(shí),它會(huì)調(diào)用Seed方法去填充數(shù)據(jù)庫(kù)。我們用這個(gè)Seed方法添加了一些例子產(chǎn)品和一個(gè)例子訂單。
This feature is great for testing, but don't use the DropCreateDatabaseIfModelChanges class in production, because you could lose your data if someone changes a model class.
這個(gè)特性對(duì)于測(cè)試是很棒的,但在產(chǎn)品(指正式運(yùn)行的應(yīng)用程序 — 譯者注)中不要使用這個(gè)DropCreateDatabaseIfModelChanges類(lèi)。因?yàn)椋绻腥诵薷牧四P皖?lèi),便會(huì)丟失數(shù)據(jù)。
Next, open Global.asax and add the following code to the Application_Start method:
下一步,打開(kāi)Global.asax,并將以下代碼添加到Application_Start方法中:
代碼如下:
System.Data.Entity.Database.SetInitializer(
new ProductStore.Models.OrdersContextInitializer());Send a Request to the Controller
向控制器發(fā)送請(qǐng)求
At this point, we haven't written any client code, but you can invoke the web API using a web browser or an HTTP debugging tool such as Fiddler. In Visual Studio, press F5 to start debugging. Your web browser will open to http://localhost:portnum/, where portnum is some port number.
此刻,我們還沒(méi)有編寫(xiě)任何客戶(hù)端代碼,但你已經(jīng)可以使用Web瀏覽器或諸如Fiddler之類(lèi)的調(diào)試工具來(lái)調(diào)用這個(gè)Web API了。在Visual Studio中按F5鍵啟動(dòng)調(diào)試。你的瀏覽器將打開(kāi)網(wǎng)址http://localhost:portnum/,這里,portnum是某個(gè)端口號(hào)。
Send an HTTP request to "http://localhost:portnum/api/admin". The first request may be slow to complete, because Entify Entity Framework needs to create and seed the database. The response should something similar to the following:
發(fā)送一個(gè)HTTP請(qǐng)求到“http://localhost:portnum/api/admin”。第一次請(qǐng)求可能會(huì)慢一些才能完成,因?yàn)閷?shí)體框架需要?jiǎng)?chuàng)建和種植數(shù)據(jù)庫(kù)。其響應(yīng)應(yīng)當(dāng)類(lèi)似于下面這樣:
代碼如下:
HTTP/1.1 200 OK
Server: ASP.NET Development Server/10.0.0.0
Date: Mon, 18 Jun 2012 04:30:33 GMT
X-AspNet-Version: 4.0.30319
Cache-Control: no-cache
Pragma: no-cache
Expires: -1
Content-Type: application/json; charset=utf-8
Content-Length: 175
Connection: Close
[{"Id":1,"Name":"Tomato Soup","Price":1.39,"ActualCost":0.99},{"Id":2,"Name":"Hammer",
"Price":16.99,"ActualCost":10.00},{"Id":3,"Name":"Yo yo","Price":6.99,"ActualCost":
2.05}]
看完此文如果覺(jué)得有所收獲,懇請(qǐng)給個(gè)推薦聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com