第十四节: EF的三种模式(四) 之 原生正宗的 CodeFirst模式的默认约定

一. 简介

 1. 正宗的CodeFirst模式是不含有edmx模型,需要手动创建实体、创建EF上下文,然后生成通过代码来自动映射生成数据库。

 2. 旨在:忘记SQL、忘记数据库。

 3. 三类配置:One To One(one-to-zero-or-one)、One To Many、Many To Many。

注意:在该模块使用最简单的模式配置这三种关系,暂时先不考虑DataAnnotation和Fluent API

 A. One To One(one-to-zero-or-one)

   ①:一个学生对应一个或零个地址,一个地址只能对应一个学生

   ②:实现方式:

    a:Student表中添加StudentAddress属性,StudentAddress表中添加Student属性,然后给StudentAddress中的主键加上[ForeignKey("stu")] ,

       特别注意stu代表Student属性的名字。

      b:编写配置文件

发现的现象

   a.已经生成了一次数据库,修改表结构,会报错:数据添加失败支持“dbContext1”上下文的模型已在数据库创建后发生更改。

    请考虑使用 Code First 迁移更新数据库(http://go.microsoft.com/fwlink/?LinkId=238269)。

   b. 类名+Id结尾属性自动生成主键。

   c.生成的数据库默认保存在数据库的安装目录下。

   d.在数据库中:StudentAddress中的studentAddressId既是主键,又是外键

 B. One To Many

 ①:一个年级有多个学生,一个学生只能在一个年级

 ②:实现方式:

   a:Student2表中添加Grade1属性,Grade1表中添加ICollection<Student2>属性

   b:编写配置文件

 发现的现象:

   a. 数据库中:Student2表中,增加了一个新的字段grade1_grade1Id作为外键

 C. Many To Many

 ①:一个学生有多门课,一门课有多个学生上

 ②:实现方式:

   a:Student3表中添加ICollection<Course1>属性,Course1表中添加ICollection<Student3>属性

   b:编写配置文件

发现的现象

 a. 数据库中多了一张表:Student3Course1,里面有两个外键

二. 代码实战

1. One To One(one-to-zero-or-one)

复制代码

 1     /// <summary>2     /// 学生表(一个学生只能有一个地址或没有地址)3     /// </summary>4     public class Student5     {6         public Student()7         {8 9         }
10         public string studentId { get; set; }
11 
12         public string studentName { get; set; }
13 
14         public virtual StudentAddress StudentAddress { get; set; }
15     }
16     /// <summary>
17     /// 学生地址表(一个地址只能对应一个学生)
18     /// </summary>
19     public class StudentAddress
20     {
21         public StudentAddress()
22         {
23 
24         }
25 
26         [ForeignKey("stu")]
27         //特别注意这个地方,stu对应下面的 Student stu;  
28         //另外特别注意:studentAddressId,符合默认的Id生成规则,自动映射成主键,否则需要加【key】特性
29         public string studentAddressId { get; set; }   
30 
31         public string addressName { get; set; }
32 
33         public virtual Student stu { get; set; }
34     }

复制代码

复制代码

 1  public class dbContext1:DbContext2     {3         public dbContext1()4             : base("name=dbContext1")5         {6 7         }8         public DbSet<Student> Student { get; set; }9 
10         public DbSet<StudentAddress> StudentAddress { get; set; }
11 
12 
13         protected override void OnModelCreating(DbModelBuilder modelBuilder)
14         {
15             base.OnModelCreating(modelBuilder);
16         }
17     }

复制代码

<!--正宗的CodeFirst OneToOne-->
<add name="dbContext1" connectionString="data source=localhost;initial catalog=CodeFirstDB1;persist security info=True;user id=sa;password=123456;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />

2. One To Many

复制代码

    /// <summary>/// 年级表(一个年级有多个学生)/// </summary>public class Grade1{public string grade1Id { get; set; }public string gradeName { get; set; }public virtual ICollection<Student2> student2 { get; set; }}/// <summary>/// 学生表(一个学生只能在一个年级)/// </summary>public class Student2{public string student2Id { get; set; }public string studentName { get; set; }public virtual Grade1 grade1 { get; set; }}

复制代码

复制代码

 public class dbContext2 : DbContext{public dbContext2(): base("name=dbContext2"){}public DbSet<Student2> Student2 { get; set; }public DbSet<Grade1> Grade1 { get; set; }protected override void OnModelCreating(DbModelBuilder modelBuilder){base.OnModelCreating(modelBuilder);}}

复制代码

   <!--正宗的CodeFirst OneToMany--><add name="dbContext2" connectionString="data source=localhost;initial catalog=CodeFirstDB2;persist security info=True;user id=sa;password=123456;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />

3. Many To Many

复制代码

    /// <summary>/// 学生表(一个学生有多门课)/// </summary>public class Student3{public string student3Id { get; set; }public string studentName { get; set; }public virtual ICollection<Course1> course { get; set; }}/// <summary>/// 课程表(一门课会有多个学生上)/// </summary>public class Course1{public string course1Id { get; set; }public string courseName { get; set; }public virtual ICollection<Student3> student { get; set; }}

复制代码

复制代码

 1  public class dbContext3 : DbContext2     {3         public dbContext3()4             : base("name=dbContext3")5         {6 7         }8         public DbSet<Student3> Student3 { get; set; }9 
10         public DbSet<Course1> Course1 { get; set; }
11 
12 
13         protected override void OnModelCreating(DbModelBuilder modelBuilder)
14         {
15             base.OnModelCreating(modelBuilder);
16         }
17     }

复制代码

   <!--正宗的CodeFirst OneToMany--><add name="dbContext3" connectionString="data source=localhost;initial catalog=CodeFirstDB3;persist security info=True;user id=sa;password=123456;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />

 

三. 总结

  上面的三种数据库表的对应关系主要都是采用的EF的默认协定,比如:

    A: 类名+ID、类名+Id、类名+id自动生成主键(类名忽略大小写),

    B: string类型自动映射成nvarchar(max)

      但在实际开发中,默认协定显然不灵活,那么我们如何自定义配置呢(自定义主键、设置非空、设置类型、长度等),EF提供两种方式:DataAnnotations和Fluent API,但大多数情况都是两者配合使用,关于二者的详细使用,请见后面章节。

 

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

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

相关文章

第十五节: EF的CodeFirst模式通过DataAnnotations修改默认协定

一. 简介 1. DataAnnotations说明&#xff1a;EF提供以特性的方式添加到 domain classes上,其中包括两类&#xff1a; A&#xff1a;System.ComponentModel.DataAnnotations命名空间下的特性是表中列的属性的。 包括&#xff1a;Key、Required、MinLength和MaxLength、StringL…

第十六节: EF的CodeFirst模式通过Fluent API修改默认协定

一. 简介 1. 优先级&#xff1a;Fluent API > data annotations > default conventions. 2. 所有的Fluent API配置都要在 OnModelCreating这个重写方法中进行 3. 常见的配置&#xff1a; ① 获取表对应的配置根&#xff1a; var stu modelBuilder.Entity<XXX>(); ②…

安卓手机挂载Linux,android 挂载NFS教程

0&#xff0c;在Ubuntu新建nfs目录:#mkdir /home/shuimu/arm_project/rootfs将FORLINX_6410_yaffs2_v1.0.tgz复制到rootfs中&#xff0c;解压当前文件夹#tar–zxf FORLINX_6410_yaffs2_v1.0.tgz1.烧写mmc&#xff0c;uboot&#xff0c;zImage到开发板。2&#xff0c;在ubuntu上…

linux apache jk,Linux下Apache+Tomcat+JK实现负载均衡和群集的完整过程

感谢chaijunkun的精彩大作&#xff0c;真的辛苦了。最近在开发的项目需要承受很高的并发量。综合各种情况&#xff0c;决定使用ApacheTomcatJK的方式实现负载均衡&#xff0c;并且作为一个统一的服务还要实现群集(同步Session)。在网上找了很多资料&#xff0c;都是零零散散的&…

第十七节: EF的CodeFirst模式的四种初始化策略和通过Migration进行数据的迁移

一. 四种初始化策略 EF的CodeFirst模式下数据库的初始化有四种策略&#xff1a; 1. CreateDatabaseIfNotExists&#xff1a;EF的默认策略&#xff0c;数据库不存在,生成数据库&#xff1b;一旦model发生变化,抛异常&#xff0c;提示走数据迁移 2. DropCreateDatabaseIfModelCha…

linux笔记本不关机直接合上,笔记本电脑不关机直接合上行吗

可以。笔记本电脑将盖子合住&#xff0c;对电脑是没有损害&#xff0c;系统的默认设置是合上盖子后电脑处于待机状态。这时电脑的大部分硬件都已经关闭&#xff0c;只有个别硬件为了唤醒计算机仍在运行&#xff0c;但都是低功耗&#xff0c;不浪费电&#xff0c;也不会加快计算…

第十九节: 结合【表达式目录树】来封装EF的BaseDal层的方法

一. 简介 该章节&#xff0c;可以说是一个简单轻松的章节&#xff0c;只要你对Expression表达式树、EF的基本使用、泛型有所了解&#xff0c;那么本章节实质上就是一个非常简单的封装章节&#xff0c;便于我们快捷开发。 PS&#xff1a;在该章节对于EF的上下文怎么处理&#xf…

115网盘linux 下载速度慢,linux vps 上 下载115网盘 的方法

大多数童鞋买的vps都是只支持linux系统的&#xff0c;因为版权的问题&#xff0c;windows系统的vps价格上面要贵一些。但是&#xff0c;遇到要下载网盘文件时&#xff0c;没有装桌面只有shell的linux vps就表示压力大了&#xff0c;幸好LV发现一个Linux vps下载115网盘的方法&a…

第二十节: 深入理解并发机制以及解决方案(锁机制、EF自有机制、队列模式等)

一. 理解并发机制 1. 什么是并发&#xff0c;并发与多线程有什么关系&#xff1f; ①. 先从广义上来说&#xff0c;或者从实际场景上来说. 高并发通常是海量用户同时访问(比如&#xff1a;12306买票、淘宝的双十一抢购)&#xff0c;如果把一个用户看做一个线程的话那么并发可…

第二十一节:ADO层次上的海量数据处理方案(SqlBulkCopy类插入和更新)

一. 简介 1. 背景&#xff1a; 虽然前面EF的扩展插件Z.EntityFramework.Extensions&#xff0c;性能很快&#xff0c;而且也很方便&#xff0c;但是该插件要收费&#xff0c;使用免费版本的话&#xff0c;需要定期更新&#xff0c;如果不更新&#xff0c;将失效&#xff0c;非…

第二十二节: 以SQLServer为例介绍数据库自有的锁机制(共享锁、更新锁、排它锁等)和事务隔离级别 :

一. 基本概念 1.共享锁&#xff1a;(holdlock) (1). select的时候会自动加上共享锁&#xff0c;该条语句执行完&#xff0c;共享锁立即释放&#xff0c;与事务是否提交没有关系。 (2). 显式通过添加(holdlock)来显式添加共享锁&#xff08;比如给select语句显式添加共享锁&…

r语言中1c0怎么表示什么,r语言表示或者用什么符号?

犯罪嫌疑人X1、对象名称中的句点(.)没有特殊意义。但美元符号($)却有着和其他语言中的句点类似的含义&#xff0c;即指定一个对象中的某些部分例如&#xff1a;(1)A$x是指数据框A中的变量x。(2)lm.x 指一个变量&#xff0c;lm$x则指对象lm的一个属性。2、 R不提供多行注释或块注…

第二十三节: EF性能篇(三)之基于开源组件 Z.EntityFrameWork.Plus.EF6解决EF性能问题

一. 开篇说明 EF的性能问题一直以来经常被人所吐槽&#xff0c;究其原因在于“复杂的操作在生成SQL阶段耗时长&#xff0c;且执行效率不高”&#xff0c;但并不是没有办法解决&#xff0c;从EF本身举几个简单的优化例子&#xff1a; ①&#xff1a;如果仅是查询数据&#xff0c…

c语言怎样计算栈的长度,数据结构与算法:栈 C语言实现

栈是仅在表尾进行插入、删除操作的线性表。即栈 S (a1, a2, a3, ………,an-1, an)&#xff0c;其中表尾称为栈顶 /top&#xff0c;表头称为栈底/base。由于只能在表尾进行操作&#xff0c;因此栈的运算规则就是“后进先出”(LIFO)和线性表类似&#xff0c;栈也有两种存储结构—…

WebApi系列(从.Net 到 .Net Core)【更新】

一. 简介 1. 什么是WebApi&#xff1f; WebApi是一个很广泛的概念&#xff0c;在这里我们特指.Net平台下的Asp.Net WebApi框架&#xff0c;它是针对各种客户端(浏览器、APP等)来构建Http服务的一个框架&#xff0c;它是一种RestFul风格的开发接口的技术&#xff0c;它比WebServ…

第一节:WebApi的纯原生态的RestFul风格接口和路由规则介绍

一. 原生态接口 1. 从默认路由开始分析 在WebApiConfig.cs类中的Register方法中&#xff0c;我们可以看到默认路由如下&#xff1a; 分析&#xff1a;请求地址在 controller 前面需要加上 api/&#xff0c;controller后面没有action&#xff0c;最后有一个参数{id}&#xff0c…

第二节:如何正确使用WebApi和使用过程中的一些坑

一. 基本调用规则 1. 前提 WebApi的默认路由规则为&#xff1a;routeTemplate: "api/{controller}/{id}", 下面为我们统一将它改为 routeTemplate: "api/{controller}/{action}/{id}",这样我们在调用的时候&#xff0c;还是通过拼接方法名来识别&#xff0…

第三节:总结.Net下后端的几种请求方式(WebClient、WebRequest、HttpClient)

一. 前言 前端调用有Form表单提交&#xff0c;ajax提交&#xff0c;ajax一般是用Jquery的简化写法&#xff0c;在这里不再过多介绍&#xff1b; 后端调用大约有这些&#xff1a;WebCient、WebRequest、Httpclient、WebapiClient&#xff0c;重点探讨Get和Post请求&#xff0c;P…

android 传感器ceshi,Android代码-传感器-测试手机支持那几种传感

Android代码----传感器-----测试手机支持那几种传感一个小小Demo检测手机支持那几种传感&#xff1a;具体代码如下&#xff1a;[Java代码]DemoSensorActivity.javapackage com.example.testsensor;import java.util.List;import android.app.Activity;import android.content.C…

第四节:跨域请求的解决方案和WebApi特有的处理方式

一. 简介 前言&#xff1a; 跨域问题发生在Javascript发起Ajax调用&#xff0c;其根本原因是因为浏览器对于这种请求&#xff0c;所给予的权限是较低的&#xff0c;通常只允许调用本域中的资源&#xff0c; 除非目标服务器明确地告知它允许跨域调用。假设我们页面或者应用已在 …