Entity Framework——建模建库
1数据库初始化策略选择
三种初始化策略:
1)CreateDatabaseIfNotExists:默认的策略。如果数据库不存在,那么就创建数据库。但是如果数据库已存在,而且实体发生了变化,就会出现异常。
2)DropCreateDatabaseIfModelChanges:模型改变时,原来的数据库会被删除,自动重新创建一个新的数据库。
3)DropCreateDatabaseAlways:每次运行都会删除原来的数据库,然后重新生成数据库。
4)Null:在Codefirst模式下,当实体结构改变时,运行程序不会自动生成表,改变实体结构与改变表结构互不影响,
前三种策略无法应对的问题是:分别改变实体模型和数据库表结构。即,当使用CreateDatabaseIfNotExists策略时,修改实体模型会抛异常(The model backing the <Database> context has changed since the database was created
);若使用DropCreateDatabaseIfModelChanges模式,那么每次运行都会重新生成数据库,这导致历史数据丢失,然而提前备份数据这种策略比较麻烦,尤其是系统上线以后。
解决办法:
采用第四种初始化策略,初次使用codefirst方式创建好数据库以后,不使用任何数据库初始化策略,即给Database.SetInitializer传null。
[DbConfigurationType(typeof(MySqlEFConfiguration))]
public class HY_WebApiContext : DbContext
{
public HY_WebApiContext(): base("name=HY_WebApiContext")
{
Database.SetInitializer<HY_WebApiContext>(null);
}
......
}
2实体关系与依赖默认规则创建的表关系
Codefirst模式下,实体与表之间的映射,随实体关系的不同而不同。
1)实体之间为一对一关系
实体
public class EntityOne
{
public int Id { get; set; }
public string FieldEntityOne { get; set; }
public EntityTwo EntityTwo { get; set; }
} public class EntityTwo
{
public int Id { get; set; }
public string FieldEntityTwo { get; set; }
}
表结构
entityones,其中EntityTwo_Id为外键。

EntityTwo

2)实体间的一对多关系
实体
public class EntityOne
{
public int Id { get; set; }
public string FieldEntityOne { get; set; }
public List<EntityTwo> EntityTwos { get; set; }
} public class EntityTwo
{
public int Id { get; set; }
public string FieldEntityTwo { get; set; }
}
表结构
entityones

entitytwoes,其中EntityOne_Id是外键

3)实体间的多对多关系
实体
public class EntityOne
{
public int Id { get; set; }
public string FieldEntityOne { get; set; }
public List<EntityTwo> EntityTwos { get; set; } } public class EntityTwo
{
public int Id { get; set; }
public string FieldEntityTwo { get; set; }
public List<EntityOne> EntityOnes { get; set; }
}
表结构
Codefirst模式下,两个实体间的多对多关系,映射为三张表,其中一张表表示实体间的联系。
entityones

entitytwoes

entitytwoentityones,其中EntityTwo_Id和EntityOne_Id是外键,这两个外键构成了改表的复合主键。

4)实体包含类型相同的两个或多个名称不同的导航属性
实体
public class EntityOne
{
public int Id { get; set; }
public string FieldEntityOne { get; set; }
public EntityTwo EntityTwos { get; set; }
public EntityTwo EntityTwosOther { get; set; }
} public class EntityTwo
{
public int Id { get; set; }
public string FieldEntityTwo { get; set; }
}
表
Entityones,其中EntityTwos_Id、EntityTwosOther_Id是外键。

entitytwoes

3为关系创建实体:
一个用户可以订阅多种出版物,一种出版物可被多个用户订阅,实体建模如下:
public class Publication
{
public int Id { get; set; }
public virtual ICollection<User> Users { get; set; }
......
} public class User
{
public int Id { get; set; }
public virtual ICollection<Publication> Publications { get; set; }
......
}
EF框架对上述多对多关系的默认处理方式为生成三张表:publications,user,publicationusers
其中publicationusers为关系表,表的属性只包括两个表的主键。
问题1:publications表的数据会大量重复:假设用户A订阅了电子学报,publications表里会有一条关于电子学报的记录,当用户B也订阅电子学报的时候,又会将这条数据插入publications表,如此等等。
解决方案:
每次向publications表插入记录时,先在表中查找待插入的刊物是否存在,如果存在就不插入,只更新publicationusers表。
问题2:虽然使用上面的方法可以解决这个问题,但用户何时订阅了一种刊物,这类信息没有被记录下来。
解决方案:
添加一个实体,表达publications,user这两个实体之间的关系,实体如下:
public class Publication
{
public int Id { get; set; }
......
}
public class User
{
public int Id { get; set; }
......
} public class PublicationUser
{
public int Id { get; set; }
/// <summary>
/// 出版物
/// </summary>
public Publication Publication { get; set; }
/// <summary>
/// 所属用户
/// </summary>
public User User { get; set; }
/// <summary>
/// 记录插入时间
/// </summary>
public DateTime InsertTime { get; set; }
/// <summary>
/// 记录修改时间
/// </summary>
public DateTime UpdateTime { get; set; }
}
经上述处理后,EF仍然生成三张表publications,user,publicationusers,与之前不同的是publicationusers表中多了Id ,InsertTime ,UpdateTime 这三个字段,同时去掉了publications,user其中的导航属性,这样的设计满足需求,且无冗余。那么经过这样的修改后,每一个PublicationUser实例对应了表中的一条记录。
Entity Framework——建模建库的更多相关文章
- 查询大数据表的效率对比:Linq to SQL、Entity Framework、企业库存储过程、ADO.Net
最近因为要开发大数据量网站,特作比较. Linq to SQL 查询 记录数:399997Linq to SQL 查询 Milliseconds:1910视图查询 记录数:399997视图查询 Mil ...
- Entity Framework的扩展库
https://github.com/jcachat/EntityFramework.DynamicFilters Provides global & scoped filters for E ...
- Programming Entity Framework CodeFirst--数据库约定和配置
这一章主要主要讲的是我们的模型如何映射到数据库,而不影响模型,以及不同的映射场景. 一.表名和列名 1.指定表名 [Table("PersonPhotos")] public cl ...
- ADO.NET-EF:ADO.NET Entity Framework 百科
ylbtech-ADO.NET-EF:ADO.NET Entity Framework 百科 ADO.NET Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 ...
- 8天掌握EF的Code First开发之Entity Framework介绍
返回<8天掌握EF的Code First开发>总目录 本篇目录 Entity Framework概要 什么是ORM Entity Framework简史 Entity Framework具 ...
- 转载 8天掌握EF的Code First开发之Entity Framework介绍
转载原地址: http://www.cnblogs.com/farb/p/IntroductionToEF.html Entity Framework概要 Entity Framework是微软的O ...
- Entity Framework开发介绍
一.Entity Framework概要 Entity Framework是微软的Object Relational Mapper(对象关系映射),也就是我们平常说的ORM,它可以让应用程序开发者将关 ...
- 《Entity Framework 6 Recipes》中文翻译系列 (37) ------ 第六章 继承与建模高级应用之独立关联与外键关联
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 6-13 在基类中应用条件 问题 你想从一个已存在的模型中的实体派生一个新的实体, ...
- Entity Framework扩展库
这个Entity Framework扩展完全支持EF 5.0/6.0,项目地址 https://github.com/loresoft/EntityFramework.Extended,这个库支持批量 ...
随机推荐
- centos7安装shipyard没有本地容器及镜像
目前docker的使用越来越多,自然需要docker的管理工具.现在使用web管理的较多,web基本上实现了跨平台,只需要浏览器,不要额外的管理客户端.web管理主要推荐shipyard和kubern ...
- Linq标准查询操作符
Linq的出现让代码简洁了不少.之前在项目中基本都在使用它,但是没有完整的整理过,今天借这个周末,将其进行整理,方便后期对其的使用.Linq的操作可以分为聚合,连接,转换,元素操作符,相等操作,生成 ...
- C语言第一次实验报告
一.实验题目,设计思路,实现方法 7-7 计算火车运行时间(15 分) 4-5 求简单交错序列前N项和(15 分) 4-2-7 装睡(10 分) 思路:7-7须将时间统一单位,化为以分钟计算再将两者相 ...
- ThreadPoolExecutor系列<一、ThreadPoolExecutor 机制>
本文系作者原创,转载请注明出处:http://www.cnblogs.com/further-further-further/p/7681529.html 解决问题: 1. 处理大量异步任务时能减少每 ...
- 关于JavaScript日期类型处理的总结
在任何一门开发语言中,对日期时间类型的处理,必不可少也非常重要,长期以来对于JS的日期类型处理较为苍白.在这里做一个浅显的总结. Date 对象用于处理日期和时间.Date 对象用于处理日期和时间.D ...
- ELK系列~Nxlog日志收集加转发(解决log4日志换行导致json转换失败问题)
本文章将会继承上一篇文章,主要讲通过工具来进行日志的收集与发送,<ELK系列~NLog.Targets.Fluentd到达如何通过tcp发到fluentd> Nxlog是一个日志收集工具, ...
- eclipse+fileSyncPlugin+svn+jenkins+tomcat
实现一个想法,把项目部署在linux服务器上,在本地的eclipse代码更新后,通过svn+jenkins自动同步到服务器, 然后通过eclipse远程debug项目.这样是不是就解决了在本地跑项目, ...
- [http服务]
[http服务] CentOS 6 httpd 程序环境 记录了httpd的主进程编号: v 主程序文件: /usr/sbin/httpd /usr/sbin/httpd.worker /usr/sb ...
- 初学者Web介绍一些前端开发中的基本概念用到的技术
Web开发是比较费神的,需要掌握很多很多的东西,特别是从事前端开发的朋友,需要通十行才行.今天,本文向初学者介绍一些Web开发中的基本概念和用到的技术,从A到Z总共26项,每项对应一个概念或者技术. ...
- 关于php加密库加密数据上传数据库或解密出错的问题
php加密拓展库随着php版本的更新,函数的使用方法有所改变,所以加密模式推荐使用ecb,其中加密算法19种,加密模式8种,通过这种方式加密后的数据上传数据库后提取出来进行解密会发现结果是乱码,我认为 ...