8表翻译模板 2-8 Table per Type Inheritance 建模

日期:2023-03-11 12:39:36 / 人气: 809 / 发布者:成都翻译公司

2、使用代码清单2-16创建一个POCO实体Business;代码清单2-19的输出如下:按下面的步骤,为表Account建模,模型中实体类型只代表激活状态的账户代码清单2-20演示了从Account表插入和获取数据。之所有这样做,是因为我们需要插入一行DeletedOn列为非null值的数据。

翻译的初衷以及为什么选择《Entity Framework 6 Recipes》来学习,请看本系列开头

2-8 每个类型继承建模的表

问题

您有这样一个数据库表,其中包含一些附加信息,这些信息属于公共表。您想使用 Table per Type Inheritance (TPT) 继承映射建模。

解决方案

假设您有两个与公共表密切相关的表。如图 2-17 所示,Businiss 表与 eCommerce 表和 Retail 表具有 1:0...1 关系。*重要的是,eCommerce 表和Retail 表具有有关Business 表中表示的业务的附加信息。(企业 ID)。

图 2-17 密切相关的表

餐桌零售和电子商务与餐桌业务密切相关,它们包含一些与业务密切相关的属性。按照以下步骤使用 TPT 对这种继承进行建模(零售和电子商务实体从业务实体继承)。

1、 在你的项目中创建一个继承自 DbContext 的上下文对象 EF6RecipesContext;

2、 使用代码清单2-16创建POCO实体Business;

代码清单2-16 创建POCO实体业务

1     [Table("Business", Schema = "Chapter2")]
2     public class Business {
3         [Key]
4         [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
5         public int BusinessId { get; protected set; }
6         public string Name { get; set; }
7         public string LicenseNumber { get; set; }
8     }

3、 使用代码清单2-17创建一个POCO实体eCommerce,它继承自Business类

代码清单 2-17 创建 POCO 实体 eCommerce

1     [Table("eCommerce", Schema = "Chapter2")]
2     public class eCommerce : Business {
3         public string URL { get; set; }
4     }

4、 使用代码清单2-18创建一个POCO实体Retail,它继承到Business类

代码清单 2-18 创建 POCO 实体零售

1     [Table("Retail", Schema = "Chapter2")]
2     public class Retail : Business {
3         public string Address { get; set; }
4         public string City { get; set; }
5         public string State { get; set; }
6         public string ZIPCode { get; set; }
7     }

5.给上下文对象EF6RecipesContext添加DbSet属性;函数如下代码清单2-18-1)

1        public Recipe8Context()
2             : base("name=EF6CodeFirstRecipesContext")
3         {
4 
5         }     

原则

表Retail 和eCommerce 位于0...1 的一侧,与表Business 的关系为1:0...1。这意味着企业不能有额外的信息,或额外的零售和电子商务信息。在面向对象编程中,我们有一个基类 Business 和两个派生类,Retail 和 eCommerce。

由于1:0...1的关系,在Retail和eCommerce表中,不可能有表Business中没有对应行的数据(行)。在面向对象中,派生类继承基类的属性,是继承的核心。在每个类型的表(通常称为 TPT)映射中,每个派生类都表示为一个单独的表。

代码清单 2-19 演示了从模型中插入和获取

代码清单2-19 在TPT模型中插入和获取实体

 1  using (var context = new EF6RecipesContext()) {
 2                 var business = new Business {
 3                     Name = "Corner Dry Cleaning",
 4                     LicenseNumber = "100x1"
 5                 };
 6                 context.Businesses.Add(business);
 7                 var retail = new Retail {
 8                     Name = "Shop and Save",
 9                     LicenseNumber = "200C",
10                     Address = "101 Main",
11                     City = "Anytown",
12                     State = "TX",
13                     ZIPCode = "76106"
14                 };
15                 context.Businesses.Add(retail);
16                 var web = new eCommerce {
17                     Name = "BuyNow.com",
18                     LicenseNumber = "300AB",
19                     URL = "www.buynow.com"
20                 };
21                 context.Businesses.Add(web);
22                 context.SaveChanges();
23             }
24             using (var context = new EF6RecipesContext()) {
25                 Console.WriteLine("
--- All Businesses ---");
26                 foreach (var b in context.Businesses) {
27                     Console.WriteLine("{0} (#{1})", b.Name, b.LicenseNumber);
28                 }
29                 Console.WriteLine("
--- Retail Businesses ---");
30                 foreach (var r in context.Businesses.OfType()) {
31                     Console.WriteLine("{0} (#{1})", r.Name, r.LicenseNumber);
32                     Console.WriteLine("{0}", r.Address);
33                     Console.WriteLine("{0}, {1} {2}", r.City, r.State, r.ZIPCode);
34                 }
35                 Console.WriteLine("
--- eCommerce Businesses ---");
36                 foreach (var e in context.Businesses.OfType()) {
37                     Console.WriteLine("{0} (#{1})", e.Name, e.LicenseNumber);
38                     Console.WriteLine("Online address is: {0}", e.URL);
39                 }
40             }

代码清单 2-19 创建并初始化了 Business 实体的一个实例和两个派生类的实例。使用上下文中设置的业务实体中的 Add() 方法将它们添加到上下文中。

在查询中,我们迭代上下文中设置的 Businesses 实体以访问所有业务。对于派生类型,我们使用泛型方法 OfType() 并通过指定特定类型参数在实体集中进行过滤。

代码清单2-19的输出如下:

--- 所有企业 --- 角落干洗 (#100X1)

购物省钱 (#200C)

(#300AB)

--- 零售业务 --- 购物省钱 (#200C)

101 主

Anytown,德克萨斯州 76106

---- 电子商务企业 (#300AB)

网上地址是:

TPT 是实体框架支持的三种继承映射之一。另外两个是 Table per Hierarchy(TPH,将在本章后面讨论)和 Table per Concrete Type(TPC,见第 15 章)。

TPT 继承映射为数据库提供了灵活性。作为开发人员,我们可以轻松地为模型中新添加的表添加派生类型。但是,每个派生类型都会涉及一个额外的连接连接,这会降低系统的性能。在实际应用中,我们已经看到了派生类型较多时使用TPT继承映射导致的性能问题。

每层级表 (TPH) 继承映射将在第 2-10 节中描述。它将整个继承类型存储在单独的表中。解决了TPT中的join连接问题,带来了不错的性能。但以牺牲数据库的灵活性为代价。

每个具体的表 (TPC) 继承映射,它在运行时由实体框架支持,但由设计器不支持。TPC 的重要应用见第 15 章。

2-9 使用条件过滤对象集

问题

您想在实体类型上创建固定条件以映射表中行的子集。

解决方案

假设您有一个包含帐户信息的数据库表,如图 2-18 所示。该表有一个可以为空的列 DeletedOn,用于存储帐户被删除的日期和时间。如果账户被激活,列DeletedOn的值为空,并且你希望实体类型只代表激活的账户,即没有DeletedOn值的账户。

图 2-18 带有 DeletedOn 列表的 Account 表

按照以下步骤为表 Account 建模。模型中的实体类型仅代表活跃账户

1、 右键单击​​您的项目,选择 Add ➤New Item8表翻译模板,然后在 Visual C# 条目下的 Data 模板下选择 ADO.NET Entity Data Model。

2、选择从数据库生成以从现有数据库创建模型,然后单击下一步。

3、您可以选择一个现有的数据库连接,也可以选择创建一个新的数据库连接。

4、 在选择数据库窗口中,选择表帐户。然后选中复选框以确定生成的对象名称的单数和复数形式,并在模型中包含外键列。单击完成

5、 如果未显示映射详细信息窗口,则单击帐户实体并查看映射详细信息窗口。选择工具菜单查看(查看)➤ 其他窗口(其他窗口)➤ 实体数据模型映射详细信息(实体数据模型映射详细信息)。单击映射详细信息窗口中的添加条件8表翻译模板,然后选择列 DeletedOn,在运算符列中,选择是,在值/属性列中,选择空。这是它创建了一个映射条件(图2-18)

6、 右击DeletedOn 属性,选择Delete,因为我们使用列DeletedOn 作为条件映射,所以不映射到实体中的属性。在我们的模型中,它的值始终为 Null。

原则

在示例中,我们在实体 Account 中应用 Is Null 条件来过滤 DeletedOn 列中有值的行。清单 2-20 演示了从 Account 表中插入和检索数据。

代理清单 2-20 从 Account 插入和获取数据

 1  using (var context = new EF6RecipesContext()) {
 2                 context.Database.ExecuteSqlCommand(@"insert into chapter2.account
 3 (DeletedOn,AccountHolderId) values ('2/10/2009',1728)");
 4                 var account = new Account { AccountHolderId = 2320 };
 5                 context.Accounts.Add(account);
 6                 account = new Account { AccountHolderId = 2502 };
 7                 context.Accounts.Add(account);
 8                 account = new Account { AccountHolderId = 2603 };
 9                 context.Accounts.Add(account);
10                 context.SaveChanges();
11             }
12             using (var context = new EF6RecipesContext()) {
13                 foreach (var account in context.Accounts) {
14                     Console.WriteLine("Account Id = {0}",
15                     account.AccountHolderId.ToString());
16                 }
17             }

代码清单2-20,我们使用传统方法调用上下文对象的Database属性中的ExecuteSqlCommand()方法向数据库中插入一行数据。这一切都是因为我们需要在 DeletedOn 列中插入一行非空值的数据。在模型中,Account 实体没有映射此列的属性。实际上,Account 实体不可能映射到DeletedOn 列的值的行,而这恰好是我们需要测试的。

对于第一部分代码的其余部分,我们创建并初始化了 Account 实体类型的 3 个实例,并通过 SaveChanges() 方法将它们保存到数据中。

当我们查询数据数据库时,通过SaveChanges()方法只能得到3个保存在数据库中的Account实体类型的实例。不会显示通过 ExecuteSqlCommand() 方法插入的数据。以下输出验证了这一结论:

帐户 ID = 2320

帐户 ID = 2502

帐户 ID = 2603

这篇文章到此结束,我们将在下一篇文章中开始TPH。

实体框架交流QQ群:458326058,欢迎有兴趣的朋友加入交流

感谢您的持续关注,我的博客地址:

相关阅读Relate

  • 法国签证营业执照翻译件模板 你与申根签证只有一条推送的距离
  • 江苏省增值税发票翻译模板 江苏税务局出口货物退(免)税申报管理系统软件
  • 肄业证书翻译模板 复旦大学学生学业证明文书管理细则(试行)
  • 四级英语作文模板带翻译 大学英语四级翻译模拟训练及答案
  • 社会某信用代码证翻译模板 js验证某社会信用代码,某社会信用代码 验证js,js+验证+社会信用代码证
  • 美国移民证件翻译模板 日语签证翻译聊聊身份证翻译模板
  • 翻译软件模板 人类史上*实用的的文档快速翻译指南
  • 江苏省增值税发票翻译模板 江苏出口货物退(免)税申报管理服务平台
  • 瑞士签证房产证翻译件模板 瑞士探亲签证—就读子女
  • 日语户口本翻译模板 户口本翻译价格_户口本翻译一般多少钱?
  • 8表翻译模板 2-8 Table per Type Inheritance 建模 www.chinazxzy.com/fymb/9601.html
    
    本站部分内容和图片来源于网络用户和读者投稿,不确定投稿用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的权利,请联系:chinazxzy@163.com,及时删除。
    Go To Top 回顶部
    • 扫一扫,微信在线