EF基础知识小记七(拆分实体到多个表以及拆分表到多个实体)
一、拆分实体到多个表
1、在日常开发中,会经常碰到一些老系统,当客户提出一些新的需求,这些需求需要在原来的表的基础上加一些字段,大多数人会选择通过给原表添加字段的方式来完成这些需求,方法,虽然可行,但是如果架构不合理的系统,就会牵一发而动全身.所以处理这种需求比较合理的方式是:建一张新表来存放新的字段.
通过叫做合并两张及以上的表到一个单独的实体,也叫分拆一个实体到多个表,我们把每个组成部分当成一个逻辑实体.这个过程叫做逻辑分拆.
缺点:每当获取实体时,框架都需要额外的Join联结.
2、示例
下面通过一个示例简单介绍下逻辑分拆
(1)、数据库表设计图
(2)、编写代码
i、确认目标项目导入了EF的相关程序集
ii、创建Product实体,代码如下:
public class Product
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int SKU { get; set; } public string Description { get; set; }
public decimal Price { get; set; }
public string ImgUrl { get; set; }
}
iii、创建数据上下文对象,该对象必须继承DbContext,代码如下:
public class EF6RecipesContext:DbContext
{
public DbSet<Product> Products { get; set; } public EF6RecipesContext():base("name=EF6RecipeEntities")
{
} protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Product>()
.Map(m => {
m.Properties(p => new { p.Sku, p.Description, p.Price });
m.ToTable("Product", "dbo");
})
.Map(m => {
m.Properties(p => new { p.Sku, p.ImgUrl });
m.ToTable("ProductWebInfo", "dbo");
});
}
}
iiii、编写测试代码:
using (var context = new EF6RecipesContext())
{
var product = new Product
{
Sku = ,
Description = "啦啦啦",
Price = 1M,
ImgUrl = "1.jpg"
};
context.Products.Add(product);
product = new Product
{
Sku = ,
Description = "哈哈哈",
Price = 2M,
ImgUrl = "2.jpg"
};
context.Products.Add(product);
product = new Product
{
Sku = ,
Description = "呵呵呵",
Price = 3M,
ImgUrl = "3.jp"
};
context.Products.Add(product);
context.SaveChanges();
}
using (var context = new EF6RecipesContext())
{
foreach (var p in context.Products)
{
Console.WriteLine("{0} {1} {2} {3}", p.Sku, p.Description,p.Price.ToString("C"), p.ImgUrl);
}
}
Console.ReadKey();
二、拆分一张表到多个实体
假设数据库中有一张表,里面包含一些常用的字段,但是也包含一些不常用的大字段。为了提供系统的性能,需要避免每个查询都去加载这些字段.这个时候我们就需要将表拆分成两个或者更多的实体.
EF基础知识小记七(拆分实体到多个表以及拆分表到多个实体)的更多相关文章
- EF基础知识小记四(数据库=>模型设计器)
EF基础知识小记三(设计器=>数据库)介绍了如何创建一个空设计器模型,并如何将模型同步到数据库的表中,本文则主要介绍如何将一个存在的数据库同步到模型设计器中.为了能快速的模拟这个过程,给出一下建 ...
- EF基础知识小记五(一对多、多对多处理)
本文主要讲EF一对多关系和多对多关系的建立 一.模型设计器 1.一对多关系 右键设计器新增关联 导航属性和外键属性可修改 2.多对多关系 右键设计器新增关联 模型设计完毕之后,根据右键设计器根据模型生 ...
- EF基础知识小记二
1.EF的常用使用场景 (1).维护一个已经存在的数据库,VS提供了工具帮助我们把数据库中的表和视图等对象导入到实体框架. [数据库=>模型(Database First)] (2 ...
- EF基础知识小记一
1.EF等ORM解决方案出现的原因 因为软件开发中分析和解决问题的方法已经接近成熟,然后关系型数据库却没有,很多年来,数据依然是保存在表行列这样的模式里,所以,在面相对象和高度标准化的数据库中产生了一 ...
- EF基础知识小记六(使用Code First建模自引用关系,常用于系统菜单、文件目录等有层级之分的实体)
日常开发中,经常会碰到一些自引用的实体,比如系统菜单.目录实体,这类实体往往自己引用自己,所以我们必须学会使用Code First来建立这一类的模型. 以下是自引用表的数据库关系图: ok,下面开始介 ...
- EF基础知识小记三(设计器=>数据库)
本文主要介绍通过EF的设计器来同步数据库和对应的实体类.并使用生成的实体上下文,来进行简单的增删查该操作 1.通过EF设计器创建一个简单模型 (1).右键目标项目添加新建项 (2).选择ADO.Net ...
- Linq基础知识小记四之操作EF
1.EF简介 EF之于Linq,EF是一种包含Linq功能对象关系映射技术.EF对数据库架构和我们查询的类型进行更好的解耦,使用EF,我们查询的对象不再是C#类,而是更高层的抽象:Entity Dat ...
- Linux基础知识第七讲,用户权限以及用户操作命令
目录 Linux基础知识第七讲,用户权限以及用户操作命令 一丶简介linux用户,用户权限,组的概念. 1.1 基本概念 1.2 组 1.3 ls命令查看权限. 二丶用户权限修改命令 1.chmod ...
- IM开发基础知识补课(七):主流移动端账号登录方式的原理及设计思路
1.引言 在即时通讯网经常能看到各种高大上的高并发.分布式.高性能架构设计方面的文章,平时大家参加的众多开发者大会,主题也都是各种高大上的话题——什么5G啦.AI人工智能啦.什么阿里双11分分钟多少万 ...
随机推荐
- LVDS_IP仿真分析
这个一个对tx_outclock移相180度后的仿真结果. tx_outclock的时钟沿与数据中心对齐. tx_coreclock时钟与inclock时钟频率相等,但有相差.
- Python是什么
Python是一种编程语言,它的名字来源于一个喜剧.也许最初设计Python这种语言的人并没有想到今天Python会在工业和科研上获得如此广泛的使用.著名的自由软件作者Eric Raymond在他的文 ...
- 解决Web Uploader上传文件和图片 延迟和not defined
1.出现list not define时,var $list = $("#fileList"); 2.选择文件框有延迟,可能是因为选择文件类型过多 mimeTypes: 'imag ...
- Go并发编程基础(译)
2015-05-20 三 By youngsterxyf 原文:Fundamentals of concurrent programming 译者:youngsterxyf 本文是一篇并发编程方面的入 ...
- android2.1中<shape>圆角的bug
android的兼容性真是一个不可忽略的问题,今天测试时发现使用xml定义Shape drawable在android 2.1上存在bug <SPANstyle="FONT-SIZE: ...
- 一个CTO谈自己的技术架构体系
理解算法背后的世界观 我比较擅长的领域可能是数据和架构两个方面吧. 大数据方面就是数据挖掘.数据分析等领域,我现在带着极光推送整个的数据团队,需要把握数据团队的技术方向,还需要做很多算法方面的研究. ...
- Jack Clark 的几句名言
Grateful for everything; entitled to nothing. 沒有任何事情是你不该感激的:沒有任何东西是你该派得到的. Leadership is the ability ...
- html隐藏元素
<body> <div>display:元素的位置不被占用</div> <div id="div1" style="displa ...
- Unity3d ugui 实现image代码换图
核心脚本代码 Image IMGE = transform.Find("IMGE").GetComponent<Image>();Sprite sprite1 = Re ...
- C#线程运用基础
ThreadStart ts=new ThreadStart(a.f);//ThreadStart 是一个委托,用以关联a.f方法Thread th=new Thread (ts);//Thread是 ...