EntityFramework进阶——Entity Splitting和Table Splitting

Entity Splitting——把单个实体拆分成多个表。Table Splitting——把单个表拆分成多个实体

Entity Splitting 

下面通过例子来说明:

假设存在如下实体类:

    public class Employee{public int EmployeeId { get; set; }public string Name { get; set; }public string PhoneNumber { get; set; }public string DetailAddress { get; set; }public DateTime CreatedTime { get; set; }public DateTime ModifiedTime { get; set; }}

在同一个Employee实体类的前提下,我们需要将DetailAddress,PhoneNumber字段放在一张表, 其余字段放在另一张表,就可以使用如下Fluent API代码进行配置:

    public class EmployeeMap:EntityTypeConfiguration<Employee>{public EmployeeMap(){Map(map =>{map.Properties(p => new{p.EmployeeId,p.Name,p.CreatedTime,p.ModifiedTime});map.ToTable("Employees");}).Map(map => {map.Properties(p => new {p.PhoneNumber,p.DetailAddress});map.ToTable("EmployeeDetails");               });}}

上下文类的代码如下图所示:

    public class SplittingModel : DbContext{public SplittingModel(): base("name=SplittingModel"){}protected override void OnModelCreating(DbModelBuilder modelBuilder){modelBuilder.Configurations.Add(new EmployeeMap());}public virtual DbSet<Employee> Employee { get; set; }}

运行程序后,数据库建表结构如下图所示:

                                             

 

当对实体类Employee进行插入数据操作时,EF会生成Employee 和 EmployeeDetail两个表的插入语句,代码 和 截图如下所示:

static void Main(string[] args)
{using (SplittingModel db = new SplittingModel()){db.Database.Log = Console.WriteLine;Employee employee = new Employee{CreatedTime = DateTime.Now,ModifiedTime = DateTime.Now,Name = "Jack",PhoneNumber = "1129373834",DetailAddress = "USA"};db.Employee.Add(employee);db.SaveChanges();Console.ReadKey();}
}

        

 

对实体Employee进行查询操作时,也会同时关联两个表,代码 和 截图如下图所示:

using (SplittingModel db = new SplittingModel())
{db.Database.Log = Console.WriteLine;var e = db.Employee.First();Console.ReadKey();
}

 

 

 


 Table Splitting

表拆分使我们能将多个实体映射到一个数据库表单,与实体拆分正好相反。我们可以将模型中的两个或者多个实体映射到同一个物理数据库表中。

例子如下,比如将两个实体类Employee和EmployeePhoto合并成一个数据表,实体类如下图所示:

    public class Employee{public int EmployeeId { get; set; }public string Name { get; set; }public string PhoneNumber { get; set; }public string DetailAddress { get; set; }public DateTime CreatedTime { get; set; }public DateTime ModifiedTime { get; set; }//导航属性public virtual EmployeePhoto Photo { get; set; }}
    public class EmployeePhoto{public int Id { get; set; }public byte[] Photo { get; set; }public Employee Employee { get; set; }}

Fluent API代码如下图所示:

    public class EmployeeMap:EntityTypeConfiguration<Employee>{public EmployeeMap(){ToTable("Employees");HasKey(p => p.EmployeeId);HasRequired(e => e.Photo).WithRequiredPrincipal(p => p.Employee);}}
    public class EmployeePhotoMap:EntityTypeConfiguration<EmployeePhoto>{public EmployeePhotoMap(){ToTable("Employees");HasKey(p => p.Id);}}

上下文类代码如下图所示:

    public class TableSplittingModel : DbContext{public TableSplittingModel(): base("name=TableSplittingModel"){}protected override void OnModelCreating(DbModelBuilder modelBuilder){modelBuilder.Configurations.Add(new EmployeeMap());modelBuilder.Configurations.Add(new EmployeePhotoMap());}public virtual DbSet<Employee> Employee { get; set; }public virtual DbSet<EmployeePhoto> EmployeePhoto { get; set; }}

生成的数据库表结果如下图所示:

                                                

 

向数据库中插入数据,代码如下图所示:

        static void Main(string[] args){using (TableSplittingModel db = new TableSplittingModel()){Employee employee = new Employee{Name = "admin",PhoneNumber = "1000",DetailAddress = "USA",CreatedTime = DateTime.Now,ModifiedTime = DateTime.Now,Photo = new EmployeePhoto {}                   };db.Employee.Add(employee);db.SaveChanges();Console.WriteLine("OK");}}

当查询实体Employee实体时,将只返回Employee实体列而不会返回EmployeePhoto列作为Employee实体一部分:

            using (TableSplittingModel db = new TableSplittingModel()){var employee = db.Employee.ToList();}

当查询Employee实体且延迟加载EmployeePhoto实体时,才会返回EmployeePhoto列:

            using (TableSplittingModel db = new TableSplittingModel()){var employee = db.Employee.Include("Photo").toList();}

 

 

 

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/548488.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

EntityFramework进阶——CodeFirst数据库迁移

与视觉操作界面相比&#xff0c;CodeFirst机制提供了一套命令行模式的迁移工具&#xff0c;协助开发人员有效的进行数据库与数据模型的同步维护操作。 新建一个控制台项目CFMigrationsDemo&#xff0c;选用来自数据库的EF设计器模式&#xff0c; 并向其中添加一个Product.cs类文…

前端控件JQuery Datatables使用——常用功能初始化

本文用于自己记录&#xff0c;忘记时可以用来回顾。点击这里进入JQuerydatatable官网API地址 JQuery Datatables初始化 个人比较喜欢JQueryDatatables的Bootstrap4风格&#xff0c;所以文章以Bootstrap4风格为例。 JQueryDatatable的初始化很简单&#xff0c;按照官网的举例说…

一款轻量级的消息提示插件 —— toastr

toastr是一款轻量级的消息提示插件&#xff0c;基于JQuery&#xff0c;使用简单方便&#xff0c;外观大气漂亮。 点击这里进入toastr在线调试使用 点击这里进入toastr官方网站 使用效果如下图所示&#xff1a; 插件使用需要引用的JS和CSS文件如下图所示&#xff1a; 各版…

《Spring Recipes》第二章笔记:Creating Beans by Invokin...

2019独角兽企业重金招聘Python工程师标准>>> 《Spring Recipes》第二章笔记&#xff1a;Creating Beans by Invoking an Instance Factory Method 问题 用户希望使用工厂类来实例化bean。 解决方案 Spring的bean元素中提供了factory-bean属性来配置工厂类&#xff0…

JQuery Datatables editor进行增删改查操作(一)

背景 editor作为Datatables的插件之一&#xff0c;功能十分强大&#xff0c;有全行编辑模式、泡泡编辑模式、行内编辑模式。个人觉得&#xff0c;除了泡泡编辑模式外&#xff0c;其他两种模式功能在实际项目中会经常使用到&#xff0c;泡泡模式提供了模态框可以对表格内的数据…

将C#中DateTime类型转化为JavaScript中的Date类型

将C#中的DateTime类型数据返回到前端页面时&#xff0c;显示的样子如下图所示&#xff1a; 可以用JS前端操作转化成JS的Date格式&#xff0c;直接上代码 &#xff1a; // 对Date的扩展&#xff0c;将 Date 转化为指定格式的String // 月(M)、日(d)、小时(h)、分(m)、秒(s)、季…

FusionCharts V3图表导出图片和PDF属性说明

百闻不如一见&#xff0c;狠狠点击&#xff0c;快快下载&#xff1a;&#xff08;演示文档有错误&#xff0c;不提供下载了。待新的演示文档出来。&#xff09; 许多朋友说上面的DEMO用不了。fusioncharts官方的演示非常不错&#xff0c;就是来不及整理&#xff0c;各位大侠们…

JQuery Datatables editor进行增删改查操作(二)

背景 上一篇对editor进行了一个基本功能的初始化操作演示&#xff0c;本文进一步了解下editor在上一篇文章功能的基础上添加了部分常用基本功能。 整体界面如下图所示&#xff1a; 新增界面&#xff1a; 新增界面增加了单选按钮&#xff0c;下拉框&#xff0c;和时间选择器&am…

《统一沟通-微软-实战》-6-部署-2-中介服务器-5-语音路由-语音策略

创建语音策略和配置 PSTN 用法记录 如果要创建新的语音策略&#xff0c;请执行以下步骤。如果要编辑语音策略&#xff0c;请参阅修改语音策略和配置 PSTN 用法记录中的相关步骤。 注意&#xff1a; 每个语音策略必须至少具有一条关联的 PSTN 用法记录。要查看企业语音部署中提…

JQuery Datatables editor 行内编辑功能

背景 ERP软件中&#xff0c;能进行行内编辑的表单是常用功能&#xff0c;行内编辑功能能让用户在表格中自己填写、修改、删除数据或者选择数据&#xff0c;可以说表格控件是ERP软件的核心控件&#xff0c;而行内编辑功能是核心中的关键。 本文会继续接着上一篇文章的介绍继续…

Shell图形化监控网络流量

shell图形化监控网络流量 网络流量的监控工具有很多&#xff0c;如&#xff1a;Mrtg、Cacti、Zabbix等等&#xff0c;他们都有着各自的特点&#xff0c;不同的侧重&#xff0c;只为适合不同的应用场景的各种特殊需求。除了网络流量监控工具以外&#xff0c;还有Nagios这样的监控…

JQuery Datatables editor 在编辑前刷新数据

背景 在同一时间&#xff0c;可能很多人在编辑修改同一数据&#xff0c;这会导致在一个人还在在修改的过程中另一人在完成了修改并保存了数据。editor在button插件的扩展中可以有效的缓解这个问题&#xff1a;自定义一个编辑按钮&#xff0c;此编辑按钮实现 点击按钮后&#x…

JQuery Datatables 显示行的附加信息

点击这里查看datatables官网介绍 点击这里查看datatables中文网介绍 效果如下图所示&#xff1a; 点击首列调用ajax返回数据&#xff0c;并展开明细行如下图所示&#xff1a; CSS代码&#xff1a; td.details-control {background: url(../../scripts/datatables-1.10.19/ima…

初涉c#设计模式-Iterator Pattern

一、迭代器模式简介(Brief Introduction) 迭代器模式(Iterator Pattern)&#xff0c;提供一种方法顺序访问一个聚合对象中元素&#xff0c;而不暴露改集合对象的内部表示。 Provide a way to access the elements of an aggregate object sequentially without exposing its un…

Buttons——CSS按钮样式库

点击进入查看官网说明 不同颜色按钮&#xff1a; <button class"button button-3d button-primary">button1</button><button class"button button-3d button-action">button2</button><button class"button button-3d b…

Win10中如何找到并打开SqlServer2008 R2配置管理器

首先Win R &#xff0c;打开运行窗口&#xff0c;然后输入&#xff1a; SQLServerManager10.msc

机器学习中的相似性度量

在做分类时常常需要估算不同样本之间的相似性度量(Similarity Measurement)&#xff0c;这时通常采用的方法就是计算样本间的“距离”(Distance)。采用什么样的方法计算距离是很讲究&#xff0c;甚至关系到分类的正确与否。 本文的目的就是对常用的相似性度量作一个总结。 本文…

EF中DB First模式下数据库中表结构变化时如何快速同步到EF模型中

没想到什么好的精准的办法&#xff0c;持续的报错&#xff0c;然后定位报错很是头疼。我目前感觉较快方式有两种&#xff0c;如果有更好的方式&#xff0c;请大家指教。 一、先在数据库中修改表的结构属性&#xff0c;再删除edmx文件中对应的实体类模型&#xff0c;然后再是“从…

HTML5 FileReader API 测试(一)

2019独角兽企业重金招聘Python工程师标准>>> 参考文章 html5之FileReader接口 http://zhangyaochun.iteye.com/blog/1487900 1、FileReader接口的作用&#xff1a; 用来把文件读入内存&#xff0c;并且读取文件中的数据。 2、支持情况 FF3.6| Chrome6 Js代码 /*…

Bootstrap模态框居中显示

Bootstrap默认的模态框不是居中显示的&#xff0c;需要稍微修改下源代码&#xff1a; 1、打开源码bootstrap.js&#xff0c;在里面找到如下代码&#xff1a; 2、在上述代码段落下面增加居中的代码即可&#xff1a; //使弹出框居中。。。var $modal_dialog $(this.$element[0]…