91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

EF6 秘籍 2th:實體數據建模基礎 (七)建模有標量屬性的多對多關系

發布時間:2020-07-10 17:23:43 來源:網絡 閱讀:598 作者:tancfeng 欄目:編程語言

問題:

    在數據庫的鏈接表中除了原有的外鍵列之外,還有其他的數據列。現在想把鏈接表及其關聯表導入到EDM中,以形成一個多對多關系或2個一對多關系。

解決方案:

    EF不支持帶有屬性的關聯。如果鏈接表包含有除了外鍵之外的其他列,EF將產生一個單獨的實體類型以表示這個鏈接表。最終的模型將包含一個鏈接表實體類型和2個一對多的關聯。

    數據庫圖表如下:

EF6 秘籍 2th:實體數據建模基礎 (七)建模有標量屬性的多對多關系   

數據庫腳本如下:

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));

    一個訂單(Order)能有多個項(Item),一個項也能包含在多個訂單里。另外,還有一個Count屬性關聯到每個訂單與項的實例。這個Count屬性就被稱為負載(Payload)。

    操作步驟同EF6 秘籍 2th:實體數據建模基礎 (五)從現有數據庫生成模型一致,不再重復。

    生成的EDM如下圖:

EF6 秘籍 2th:實體數據建模基礎 (七)建模有標量屬性的多對多關系

原理:

    EF不支持帶有其他屬性列的關聯。它將轉換這個鏈接表為一個包含2個一對多關聯的實體。在這種情況下,OrderItem表沒有被轉換成一個關聯,而是轉換為一個1對多關聯到Order和一個1對多關聯到Item的實體類型。

    額外屬性列的增加需要關聯表的實體提供一個額外的跳板以獲取相關的項。

            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);
                    }
                }                
            }

運行結果如下:

EF6 秘籍 2th:實體數據建模基礎 (七)建模有標量屬性的多對多關系


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

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();

最佳實踐:

    由于鏈接表有負載和沒有負載,生成的模型完全不同。這就需要我們在設計之初就需要分析鏈接表會不會有其他列的可能,如果不能確定,使用一個自增列。這樣的話就會生成一個包含2個1對多關系的實體類型。在以后進行其他屬性列擴展時,對模型的影響最小。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

洞头县| 雷州市| 宜昌市| 乡宁县| 峨眉山市| 许昌县| 喜德县| 普陀区| 崇阳县| 永州市| 谷城县| 安吉县| 平果县| 汪清县| 揭东县| 河间市| 诸暨市| 沅陵县| 博罗县| 宽城| 卢湾区| 垫江县| 沙田区| 绥中县| 北票市| 甘肃省| 秀山| 开远市| 小金县| 贡觉县| 九江县| 扎鲁特旗| 文水县| 江阴市| 黔东| 奇台县| 景谷| 抚宁县| 吉木萨尔县| 舟曲县| 海城市|