亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Asp.Net Web API 2第十八課——Working with Entity Relations in OData

2019-11-15 02:30:53
字體:
來源:轉載
供稿:網友

asp.net Web API 2第十八課——Working with Entity Relations in OData

前言

  閱讀本文之前,您也可以到Asp.Net Web API 2 系列導航進行查看http://www.49028c.com/aehyok/p/3446289.html?!?/p>

  本文的示例代碼的下載地址為http://pan.baidu.com/s/1o6lqXN8

大多數的數據集定義實體間的關系:客戶有訂單、書籍有作者、產品有供應商。客戶端可以使用OData操作實體間的關系。給定一個產品,你可以找到該產品的供應商。您也可以創建或者刪除關系。例如,您也可以為一個產品設置一個供應商。

  本教程將會展示在Asp.Net Web API中支持這些操作。本文的教程是建立在上一節的教程之上http://www.49028c.com/aehyok/p/3545824.html。

Add a Supplier Entity添加一個供應商實體類

首先我們需要來添加一個Supplier的實體類

namespace OData.Models{    public class Supplier    {        [Key]        public string Key { get; set; }        public string Name { get; set; }    }}

這個類使用了一個字符串類型的實體鍵。在實踐中,這可能比使用整形鍵不太常見的。但它是值得的看到OData如何處理除了整數以外的其他鍵類型。

接下來,我們將通過在PRoduct類上添加一個Supplier的屬性來建立一個關系。

    public class Product    {        public int ID { get; set; }        public string Name { get; set; }        public decimal Price { get; set; }        public string Category { get; set; }        // New code        [ForeignKey("Supplier")]        public string SupplierId { get; set; }        public virtual Supplier Supplier { get; set; }    }

添加一個新的DbSetProductServiceContext類,從而使實體框架將包括Supplier數據庫表中。

    public class ProductServiceContext : DbContext    {        public ProductServiceContext() : base("name=ProductServiceContext")        {        }        public DbSet<Product> Products { get; set; }        ///New Code        public DbSet<Supplier> Suppliers { get; set; }        }

在WebApiConfig.cs,添加一個“Suppliers”實體的EDM模型:

            ODataConventionModelBuilder builder = new ODataConventionModelBuilder();            builder.EntitySet<Product>("Products");            // New code:            builder.EntitySet<Supplier>("Suppliers");

Navigation Properties導航屬性

為了得到一個產品的供應商,客戶端發送了一個Get請求:

GET /Products(1)/Supplier

在Product類型上有一個Supplier的導航屬性。在這個實例中,Supplier是一個單一的項。但是一個導航屬性也能返回一個集合(一對多或者多對多的 關系)。

為了支持這個請求,在ProductsController上添加如下方法:

        // GET /Products(1)/Supplier        public Supplier GetSupplier([FromODataUri] int key)        {            Product product = db.Products.FirstOrDefault(p => p.ID == key);            if (product == null)            {                throw new HttpResponseException(HttpStatusCode.NotFound);            }            return product.Supplier;        }

key這個參數就是這個Product的鍵。這個方法返回關聯的實體——在這個實例中,就是一個Supplier對象。方法的名稱和參數的名稱都是非常重要的??傊?,如果導航屬性被命名為一個“X”,你需要添加一個被命名為“GetX”的方法。這個方法必須采用一個命名為“key”的參數,用來匹配父類數據類型的key。

它也是很重要的在鍵參數上擁有【FromOdataUri】的屬性。當它從請求的URL中解析鍵時,這個屬性將會告訴Web API去使用Odata語法規則。

Creating and Deleting Links

OData支持創建和刪除兩個實體之間的關系。在OData術語中,這個關系就是一個“link”。每個link有一個攜帶entity/$links/entity的Url。例如,由產品到供應商的鏈接看起來像這樣:

/Products(1)/$links/Supplier

為了創建一個新的鏈接,這個客戶端發送了一個post請求到這個鏈接URI。請求的消息體就是目標實體的URI。例如,假設有一個供應商的鍵為“CTSO”。為了創建一個鏈接由“Product(1)”到”Supplier('CTSO')“,客戶端發送一個請求如下:

POST http://localhost/odata/Products(1)/$links/SupplierContent-Type: application/jsonContent-Length: 50{"url":"http://localhost/odata/Suppliers('CTSO')"}

對于刪除一個鏈接,客戶端發送了一個DELETE 請求到鏈接URI。

Creating Links

為啟用一個客戶端去創建產品-供應商的鏈接,需要在ProductsController類中添加如下的代碼:

[AcceptVerbs("POST", "PUT")]public async Task<IHttpActionResult> CreateLink([FromODataUri] int key, string navigationProperty, [FromBody] Uri link){    if (!ModelState.IsValid)    {        return BadRequest(ModelState);    }                Product product = await db.Products.FindAsync(key);    if (product == null)    {        return NotFound();    }                switch (navigationProperty)    {        case "Supplier":            string supplierKey = GetKeyFromLinkUri<string>(link);            Supplier supplier = await db.Suppliers.FindAsync(supplierKey);            if (supplier == null)            {                return NotFound();            }            product.Supplier = supplier;            await db.SaveChangesAsync();            return StatusCode(HttpStatusCode.NoContent);        default:            return NotFound();    }}

這個方法有三個參數:

第一個key:就是引導到父類實體的鍵

第二個navigationProperty: 導航屬性的名稱。例如,最合適的導航屬性Supplier。

第三個link:被鏈接實體的OData的URI。這個值是從消息體中獲得。例如,這個鏈接URI可能是”http://localhost/odata/Suppliers('CTSO')“,也就是供應商中有ID="CTSO"。

這個方法用這個鏈接去查找Supplier。如果匹配的供應商被發現,這個方法將會設置Product實體類的Supplier的屬性,并且保存結果到數據庫。

其中最難的部分是解析鏈接URI。從根本上來說,你需要模擬發送一個get請求到那個URI。接下來的輔助方法將會展示如何處理它。這個方法調用Web API路由過程,返回一個OData實體,展現被轉換的OData路徑。對于一個鏈接URI,這個片段數中應該有一個實體鍵。

// Helper method to extract the key from an OData link URI.private TKey GetKeyFromLinkUri<TKey>(Uri link){    TKey key = default(TKey);    // Get the route that was used for this request.    IHttpRoute route = Request.GetRouteData().Route;    // Create an equivalent self-hosted route.     IHttpRoute newRoute = new HttpRoute(route.RouteTemplate,         new HttpRouteValueDictionary(route.Defaults),         new HttpRouteValueDictionary(route.Constraints),        new HttpRouteValueDictionary(route.DataTokens), route.Handler);    // Create a fake GET request for the link URI.    var tmpRequest = new HttpRequestMessage(HttpMethod.Get, link);    // Send this request through the routing process.    var routeData = newRoute.GetRouteData(        Request.GetConfiguration().VirtualPathRoot, tmpRequest);    // If the GET request matches the route, use the path segments to find the key.    if (routeData != null)    {        ODataPath path = tmpRequest.GetODataPath();        var segment = path.Segments.OfType<KeyValuePathSegment>().FirstOrDefault();        if (segment != null)        {            // Convert the segment into the key type.            key = (TKey)ODataUriUtils.ConvertFromUriLiteral(                segment.Value, ODataVersion.V3);        }    }    return key;}

Deleting Links

對于刪除一個鏈接,在ProductsController類中添加如下代碼:

public async Task<IHttpActionResult> DeleteLink([FromODataUri] int key, string navigationProperty){    Product product = await db.Products.FindAsync(key);    if (product == null)    {        return NotFound();    }    switch (navigationProperty)    {        case "Supplier":            product.Supplier = null;            await db.SaveChangesAsync();            return StatusCode(HttpStatusCode.NoContent);        default:            return NotFound();    }}

在這個例子中,這個導航屬性是一個簡單的Supplier實體。如果導航屬性是一個集合,對于刪除一個鏈接的URI必須在被關聯的實體中有一個鍵。例如:

DELETE /odata/Customers(1)/$links/Orders(1)

這里展示的則是1對多的關系中,刪除其中的一個的例子。

這個請求就是從客戶1中移除訂單為1的。這個DeleteLink方法將會有如下簽名:

void DeleteLink([FromODataUri] int key, string relatedKey, string navigationProperty);

簡單測試結果

1、http://localhost:3629/Odata/Products(1)/Supplier

2、

將ID=2的Supplier修改為WING

請求Header

POST http://localhost/odata/Products(2)/$links/SupplierContent-Type: application/jsonContent-Length: 50

請求Body

{"url":"http://localhost/odata/Suppliers('WING')"}

現在再次查看http://localhost/Odata/Products

3、DELETE http://localhost/odata/Products(2)/$links/Supplier那么這樣就可以將上面的SupplierId=WING修改為null

然后再次執行http://localhost/Odata/Products查看

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩经典一区二区三区| 成人激情视频免费在线| 91九色国产社区在线观看| 俺去了亚洲欧美日韩| 国产精品亚洲一区二区三区| 91精品啪在线观看麻豆免费| 欧美日韩成人黄色| 国产一区红桃视频| 九九久久久久99精品| 久久久久久午夜| 精品亚洲一区二区三区在线播放| 亚洲人成伊人成综合网久久久| 中文字幕精品久久久久| 亚洲精品视频免费| 国产视频久久久久久久| 国产精品精品久久久| 国产午夜精品一区二区三区| 日韩av在线免播放器| 久久欧美在线电影| 亚洲一区二区免费| 亚洲伊人久久大香线蕉av| 亚洲欧美精品在线| 国产色婷婷国产综合在线理论片a| 欧美成人精品h版在线观看| 国产suv精品一区二区三区88区| 插插插亚洲综合网| 国产成人在线亚洲欧美| 久久av资源网站| 国产精品视频专区| 精品国产福利在线| 国产欧美日韩中文字幕在线| 精品视频偷偷看在线观看| 久久久极品av| 亚洲成年人在线播放| 91视频8mav| 久久久久亚洲精品国产| 亚洲日韩欧美视频| 精品二区三区线观看| 欧美激情视频免费观看| 精品欧美一区二区三区| 久久久免费精品视频| 欧美中文字幕在线播放| 欧美成人午夜激情在线| 久久久久久久久久久国产| 亚洲成在人线av| 国产亚洲人成a一在线v站| 日韩精品在线免费| 国产一区二区三区四区福利| 国产精品激情av在线播放| 亚洲国产97在线精品一区| www.亚洲男人天堂| 亚洲第一精品夜夜躁人人爽| 国产精品久久一区| 久久91超碰青草是什么| 亚洲淫片在线视频| 日韩精品亚洲精品| 欧美性xxxx极品高清hd直播| 欧美国产视频日韩| 久久久久国产一区二区三区| 亚洲精品欧美一区二区三区| 欧美日韩精品在线视频| 欧美国产欧美亚洲国产日韩mv天天看完整| 久久久黄色av| 亚洲精品国产精品国自产在线| 欧美电影电视剧在线观看| 欧美性精品220| 亚洲欧美一区二区三区在线| 国产欧美一区二区三区在线看| 国产在线观看不卡| 性欧美暴力猛交69hd| 一区二区欧美在线| 精品亚洲一区二区| 欧美精品久久一区二区| 中文字幕成人在线| 日本成人黄色片| 亚洲电影免费观看高清完整版在线观看| 国产精国产精品| 久久91精品国产91久久久| 日韩欧美在线视频观看| 亚洲成人av片| 久久久在线免费观看| 日韩av在线免费看| 日韩亚洲国产中文字幕| 草民午夜欧美限制a级福利片| 成人黄色在线观看| 亚洲国产97在线精品一区| 亚洲天堂免费观看| 日韩中文视频免费在线观看| 中文字幕av一区二区三区谷原希美| 久久亚洲欧美日韩精品专区| 日韩视频免费看| 亚洲欧美日韩久久久久久| 亚洲欧美日韩国产精品| 久久99国产精品久久久久久久久| 精品在线欧美视频| 色一区av在线| 精品精品国产国产自在线| 国产精品视频色| 精品小视频在线| 亚洲欧洲在线视频| 国内免费久久久久久久久久久| 成人福利网站在线观看11| 欧美在线观看日本一区| 成人欧美一区二区三区在线| 欧美日韩国产在线| 久久久久在线观看| 亚洲有声小说3d| 国内伊人久久久久久网站视频| 亚洲片国产一区一级在线观看| 中文字幕亚洲欧美日韩高清| 在线一区二区日韩| 久99久在线视频| 久久久免费电影| 色综合久综合久久综合久鬼88| 久久久国产精彩视频美女艺术照福利| 亚洲影院色在线观看免费| 国产suv精品一区二区三区88区| 26uuu久久噜噜噜噜| 欧美另类99xxxxx| 久久久久久久国产精品| 亚洲白拍色综合图区| 一本一本久久a久久精品牛牛影视| 欧美限制级电影在线观看| 日产精品99久久久久久| 97精品国产91久久久久久| 欧美亚洲午夜视频在线观看| 久久久精品2019中文字幕神马| 伊人男人综合视频网| 中文字幕综合在线| 亚洲18私人小影院| 日本国产精品视频| 欧美伊久线香蕉线新在线| 色播久久人人爽人人爽人人片视av| 热久久这里只有| 国产精品高清免费在线观看| 日本中文字幕不卡免费| 国产在线精品一区免费香蕉| 国产中文日韩欧美| 欧美一级大片在线免费观看| 91九色蝌蚪国产| 欧美激情视频在线免费观看 欧美视频免费一| 亚洲国产欧美一区二区三区久久| 欧美壮男野外gaytube| 欧洲成人免费aa| 日韩一区二区福利| 热久久这里只有精品| 91久久精品国产91久久| 中文字幕欧美视频在线| 国产日韩换脸av一区在线观看| 亚洲国产97在线精品一区| 欧美日韩另类视频| 日韩精品在线私人| 国产日韩精品一区二区| 亚洲最大的网站| 人人澡人人澡人人看欧美| 黑人精品xxx一区一二区| 97在线视频一区| 亚洲欧美中文另类| 日韩视频免费大全中文字幕| 91精品国产色综合久久不卡98口| 性色av一区二区三区免费| 亚洲国产成人精品久久久国产成人一区| 亚洲精品www久久久久久广东| 成人精品久久av网站|