EF6秘籍2th:實(shí)體數(shù)據(jù)建?;A(chǔ)(七)建模有標(biāo)量屬性的多對(duì)多關(guān)系

問(wèn)題:

創(chuàng)新互聯(lián)專注于企業(yè)全網(wǎng)營(yíng)銷(xiāo)推廣、網(wǎng)站重做改版、嶧城網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5開(kāi)發(fā)商城系統(tǒng)網(wǎng)站開(kāi)發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為嶧城等各大城市提供網(wǎng)站開(kāi)發(fā)制作服務(wù)。

    在數(shù)據(jù)庫(kù)的鏈接表中除了原有的外鍵列之外,還有其他的數(shù)據(jù)列?,F(xiàn)在想把鏈接表及其關(guān)聯(lián)表導(dǎo)入到EDM中,以形成一個(gè)多對(duì)多關(guān)系或2個(gè)一對(duì)多關(guān)系。

解決方案:

    EF不支持帶有屬性的關(guān)聯(lián)。如果鏈接表包含有除了外鍵之外的其他列,EF將產(chǎn)生一個(gè)單獨(dú)的實(shí)體類(lèi)型以表示這個(gè)鏈接表。最終的模型將包含一個(gè)鏈接表實(shí)體類(lèi)型和2個(gè)一對(duì)多的關(guān)聯(lián)。

    數(shù)據(jù)庫(kù)圖表如下:

EF6 秘籍 2th:實(shí)體數(shù)據(jù)建?;A(chǔ) (七)建模有標(biāo)量屬性的多對(duì)多關(guān)系   

數(shù)據(jù)庫(kù)腳本如下:

use [EF6Recipes]
go

create table Chapter2.Item(
SKU int primary key,
[Description] varchar(50) not null,
Price decimal(18,2) not null);

create table Chapter2.[Order](
OrderId int identity primary key,
OrderDate datetime not null);

create table Chapter2.OrderItem(
OrderId int foreign key references Chapter2.[Order](OrderId),
SKU int foreign key references Chapter2.Item(SKU),
[Count] int not null,
constraint PK_OrderItem primary key (OrderId,SKU));

    一個(gè)訂單(Order)能有多個(gè)項(xiàng)(Item),一個(gè)項(xiàng)也能包含在多個(gè)訂單里。另外,還有一個(gè)Count屬性關(guān)聯(lián)到每個(gè)訂單與項(xiàng)的實(shí)例。這個(gè)Count屬性就被稱為負(fù)載(Payload)。

    操作步驟同EF6 秘籍 2th:實(shí)體數(shù)據(jù)建?;A(chǔ) (五)從現(xiàn)有數(shù)據(jù)庫(kù)生成模型一致,不再重復(fù)。

    生成的EDM如下圖:

EF6 秘籍 2th:實(shí)體數(shù)據(jù)建?;A(chǔ) (七)建模有標(biāo)量屬性的多對(duì)多關(guān)系

原理:

    EF不支持帶有其他屬性列的關(guān)聯(lián)。它將轉(zhuǎn)換這個(gè)鏈接表為一個(gè)包含2個(gè)一對(duì)多關(guān)聯(lián)的實(shí)體。在這種情況下,OrderItem表沒(méi)有被轉(zhuǎn)換成一個(gè)關(guān)聯(lián),而是轉(zhuǎn)換為一個(gè)1對(duì)多關(guān)聯(lián)到Order和一個(gè)1對(duì)多關(guān)聯(lián)到Item的實(shí)體類(lèi)型。

    額外屬性列的增加需要關(guān)聯(lián)表的實(shí)體提供一個(gè)額外的跳板以獲取相關(guān)的項(xiàng)。

            using (var context = new EF6RecipesContext())
            {
                var oiList = new List<OrderItem>();
                var order1 = new Order { OrderDate = new DateTime(2010, 1, 18) };
                var order2 = new Order { OrderDate = new DateTime(2010, 1, 19) };
                var item1 = new Item { SKU = 1729, Description = "Backpack", Price = 29.97M };
                var item2 = new Item { SKU = 2929, Description = "Water Filter", Price = 13.97M };
                var item3 = new Item { SKU = 1847, Description = "Camp Stove", Price = 43.99M };

                oiList.Add(new OrderItem { Order = order1, Item = item1, Count = 1 });
                oiList.Add(new OrderItem { Order = order1, Item = item2, Count = 3 });
                oiList.Add(new OrderItem { Order = order1, Item = item3, Count = 1 });
                oiList.Add(new OrderItem { Order = order2, Item = item1, Count = 2 });
                oiList.Add(new OrderItem { Order = order2, Item = item2, Count = 2 });
                oiList.Add(new OrderItem { Order = order2, Item = item3, Count = 2 });

                context.OrderItems.AddRange(oiList);
                context.SaveChanges();       
            }

            using (var context = new EF6RecipesContext())
            {
                foreach (var order in context.Orders)
                {
                    Console.WriteLine("Order # {0}, orderd on {1}",
                        order.OrderId,
                        order.OrderDate.ToShortDateString());
                    Console.WriteLine("SKU\tDescription\tQty\tPrice");
                    Console.WriteLine("---\t-----------\t---\t-----");
                    foreach (var oi in order.OrderItems)
                    {
                        Console.WriteLine("{0}\t{1}\t{2}\t{3}",
                            oi.SKU, oi.Item.Description, oi.Count, oi.Item.Price);
                    }
                }                
            }

運(yùn)行結(jié)果如下:

EF6 秘籍 2th:實(shí)體數(shù)據(jù)建模基礎(chǔ) (七)建模有標(biāo)量屬性的多對(duì)多關(guān)系

該代碼與原文提供的程序不一樣,原文提供的代碼我執(zhí)行的時(shí)候只插入了Order的數(shù)據(jù),附原文代碼:

var order = new Order { OrderId = 1,
OrderDate = new DateTime(2010, 1, 18) };
var item = new Item { SKU = 1729, Description = "Backpack",
Price = 29.97M };
var oi = new OrderItem { Order = order, Item = item, Count = 1 };
item = new Item { SKU = 2929, Description = "Water Filter",
Price = 13.97M };
oi = new OrderItem { Order = order, Item = item, Count = 3 };
item = new Item { SKU = 1847, Description = "Camp Stove",
Price = 43.99M };
oi = new OrderItem { Order = order, Item = item, Count = 1 };
context.Orders.Add(order);
context.SaveChanges();

最佳實(shí)踐:

    由于鏈接表有負(fù)載和沒(méi)有負(fù)載,生成的模型完全不同。這就需要我們?cè)谠O(shè)計(jì)之初就需要分析鏈接表會(huì)不會(huì)有其他列的可能,如果不能確定,使用一個(gè)自增列。這樣的話就會(huì)生成一個(gè)包含2個(gè)1對(duì)多關(guān)系的實(shí)體類(lèi)型。在以后進(jìn)行其他屬性列擴(kuò)展時(shí),對(duì)模型的影響最小。

網(wǎng)站題目:EF6秘籍2th:實(shí)體數(shù)據(jù)建?;A(chǔ)(七)建模有標(biāo)量屬性的多對(duì)多關(guān)系
文章來(lái)源:http://bm7419.com/article14/jcchge.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)手機(jī)網(wǎng)站建設(shè)、全網(wǎng)營(yíng)銷(xiāo)推廣網(wǎng)站導(dǎo)航、用戶體驗(yàn)靜態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作