测试以下几种模型关系:

1对1或0  、 1对多  、 多对多

1 对 1 或 0

如果直接定义两个模型,相互直接增加导航属性,会提示错误,必须为这个对应关系设定主副关系;

    public class Team
{
public int ID { get; set; }
public string Name { get; set; }

public virtual Address Address { get; set; }
} public class Address
{
[ForeignKey("Team")]
public int ID { get; set; }
public string City { get; set; }
public string DetailAddress { get; set; }
public virtual Team Team { get; set; }
}

1 对 多  ( 0或1 对多):

    public class Model1
{
public int ID { get; set; }
public string Name { get; set; }
public virtual ICollection<Model2> Model2s { get; set; }
} public class Model2
{
public int ID { get; set; }
public string Name { get; set; }
}

主表中定义子表的ICollection<T>导航属性行即可实现EF自动创建两个表,并在子表中自动增加 Model1_ID 列;(列名命名格式为:<类名>+下划线+<主键名>)

(并且自动为外键):(外键命名规则:FK_ + <子表全名> + 下划线 + <主表全名> + 下划线 + 列名)

也就是说在子表中并不一定需要主表的导航属性就可以定义主次表1对多的关系;

如果希望手动来定义外键,则必须在子表中明确增加主表的导航属性:

    public class Model1
{
public int ID { get; set; }
public string Name { get; set; }
public virtual ICollection<Model2> Model2s { get; set; }
} public class Model2
{
public int ID { get; set; }
[ForeignKey("Model1")]
public int Model1ID { get; set; } public string Name { get; set; }
public virtual Model1 Model1 { get; set; }
}

此时,外键列名就为自己设定的名称,外键也会根据命名规则,最后部分变为外键列名;
上面2个方式除了命名规则不同以外,还有个不同,第2种方式由于外键对应的列是int 数值型的,那么就不可以为空;即只能是多对1,不可以是多对0;

当然也可以在数值型后面加 ? ,来定义可以为空;(用来实现 0或1 对 多

注意:在数据库升级迁移过程中,把一个字段从可以为空变为不可以为空,如果这个表中存在数据而且该字段存在为空的行,则数据库升级将不会成功!

 

多对多

    public class Student
{
public int ID { get; set; }
public string Name { get; set; }
public virtual ICollection<Course> Courses { get; set; }
} public class Course
{
public int ID { get; set; }
public string Name { get; set; }
public virtual ICollection<Student> Students { get; set; }
}

多对多表是在两个模型相互加 ICollection<T> 导航属性;
EF会自动增加一个新表用来存放对应关系表;

EF6学习笔记(六续) 复杂数据模型建表测试的更多相关文章

  1. ASP.NET MVC5 及 EF6 学习笔记 - (目录整理)

    个人从传统的CS应用开发(WPF)开始转向BS架构应用开发: 先是采用了最容易上手也是最容易搞不清楚状况的WebForm方式入手:到后面就直接抛弃了服务器控件的开发方式,转而采用 普通页面+Ajax+ ...

  2. EF6学习笔记(六) 创建复杂的数据模型

    EF6学习笔记总目录:ASP.NET MVC5 及 EF6 学习笔记 - (目录整理) 本篇原文地址:Creating a More Complex Data Model 本篇讲的比较碎,很多内容本人 ...

  3. 【EF6学习笔记】目录

    [EF6学习笔记](一)Code First 方式生成数据库及初始化数据库实际操作 [EF6学习笔记](二)操练 CRUD 增删改查 [EF6学习笔记](三)排序.过滤查询及分页 [EF6学习笔记]( ...

  4. EF6 学习笔记(五):数据库迁移及部署

    EF6学习笔记总目录:ASP.NET MVC5 及 EF6 学习笔记 - (目录整理) 原文地址:Code First Migrations and Deployment 原文主要讲两部分:开发环境下 ...

  5. EF6学习笔记(四) 弹性连接及命令拦截调试

    EF6学习笔记总目录:ASP.NET MVC5 及 EF6 学习笔记 - (目录整理) 本章原文地址:Connection Resiliency and Command Interception 原文 ...

  6. EF6 学习笔记(一):Code First 方式生成数据库及初始化数据库实际操作

    EF6 学习笔记总目录:ASP.NET MVC5 及 EF6 学习笔记 - (目录整理) 本篇参考原文地址: Creating an Entity Framework Data Model 说明:学习 ...

  7. Java IO学习笔记六:NIO到多路复用

    作者:Grey 原文地址:Java IO学习笔记六:NIO到多路复用 虽然NIO性能上比BIO要好,参考:Java IO学习笔记五:BIO到NIO 但是NIO也有问题,NIO服务端的示例代码中往往会包 ...

  8. java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

    java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...

  9. Learning ROS for Robotics Programming Second Edition学习笔记(六) indigo xtion pro live

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

随机推荐

  1. Servlet】(2)有关Servlet实现的几个类:GenericServlet、HttpServlet、ServletConfig、ServletContext

    一.GenericServlet 1.所有的成员方法: 1.在javaWeb项目中: 2.web.xml <?xml version="1.0" encoding=" ...

  2. Android 开发 创建WiFi、WiFi热点 ---开发集合

    WIFI 权限 <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> < ...

  3. IntelliJ IDEA 性能优化

    idea打开的多了 内存占用也就多了 下边是亲试的优化ide性能的方法 1.设置JVM的启动参数: 进入idea的安装目录的bin文件夹 打开 idea.exe.vmoptions 文件, 修改-Xm ...

  4. py库: matplotlib

    Matplotlib是一个Python 2D绘图库,可以跨平台生成各种硬拷贝格式和交互式环境的出版品质量图. http://matplotlib.org/ matplotlib官网 http://py ...

  5. Calendar打印日历

    package com.example.demo; import org.junit.Test; import org.junit.runner.RunWith; import org.springf ...

  6. Redis内存模型总结

    一.Redis内存统计 在客户端通过redis-cli连接服务器后,通过info命令可以查看内存使用情况: info memory 返回结果中比较重要的几个说明如下: (1)used_memory:R ...

  7. linux 硬链接 软链接

    硬链接 链接文件的INode和源文件相同,删除互不影响,不支持跨分区,不支持目录 软链接 链接文件有单独的INode,其Block中存储源文件的INode信息,相当于windows中 的快捷方式 ln ...

  8. java正则表达式 需要转义的字符

    特别字符 说明 $ 匹配输入字符串的结尾位置.如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 ‘\n' 或‘\r'.要匹配 $ 字符本身,请使用 \$. ( ) 标记一个子 ...

  9. C++继承中关于子类构造函数的写法

    构造方法用来初始化类的对象,与父类的其它成员不同,它不能被子类继承(子类可以继承父类所有的成员变量和成员方法,但不继承父类的构造方法).因此,在创建子类对象时,为了初始化从父类继承来的数据成员,系统需 ...

  10. java基础-- 之类型转换 和 一些运算符

    ---   首先   看一个 Scanner  类 import java.util.Scanner; public class TestScanner { public static void ma ...