都有哪几种关系?

1vs多,多vs多

1. 概念or关系映射相关方法:

1) 基本套路:this.Has***(o=>o.AAA).With***() 当前这个表和AAA属性的表关系是Has定义,With定义AAA表和这个表的关系

BBBConfig{
//这是1vs多的关系,1个AAA钟包含多个BBB
public BBBConfig(){
//这个BBB有多少个A属性;从后读A钟有多少B
this.Has***(o=>o.A).With***();
}
} class AAA{
public long Id{get;set;}
} class BBB{
public long Id{get;set;}
public AAA A{get;set;}
}

2)  HasOptional() 有一个可选的(可以为空的)

3)  HasRequired() 有一个必须的(不能为空的)

4)  HasMany() 有很多的

5)  WithOptional() 可选的

6)  WithRequired() 必须的

7)  WithMany() 很多的

Eg:

在AAA实体中配置this.HasRequired(o=>o.BBB).WithMany();

表示在AAA中有且只有一个BBB,而在BBB中有对应多个AAA;

在AAA实体中配置this.HasRequired(o=>o.BBB).WithRequired();

表示在AAA中有且只有一个BBB,而在BBB中也只有一个对应的AAA

练习:

public class Class
{
public long Id { get; set; }
public string Name { get; set; }
//双向设计关系会让模型变的更难理解,同时可通过代码替代
// Class clz = ctx.Classes.First();
//var students =ctx.Students.Where(s => s.ClassId == clz.Id);
public virtual ICollection<Student> Students { get; set; } = new List<Student>();
} public class Student
{
public long Id { get; set; }
public string Name { get; set; }
public long ClassId { get; set; }
public virtual Class Class { get; set; }
public int Age { get; set; }
}

实体类

public class ClassConfig:EntityTypeConfiguration<Class>
{
public ClassConfig() {
ToTable("T_Classes");
}
}
public class StudentConfig:EntityTypeConfiguration<Student>
{
public StudentConfig() {
ToTable("T_Students");
}
}
public class TestContent:DbContext
{
public TestContent() : base("name=connStr")
{
Database.SetInitializer<TestContent>(null);
} protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Configurations.AddFromAssembly(Assembly.GetExecutingAssembly());
} public DbSet<Class> Classes { get; set; }
public DbSet<Student> Students { get; set; }
}
static void Main(string[] args)
{
using (TestContent ctx = new Tests.TestContent())
{
ctx.Database.Log = (sql) =>
{
Console.WriteLine(sql);
};
Class clz = new Tests.Class();
clz.Name = "一年一班";
ctx.Classes.Add(clz); Student s1 = new Tests.Student();
s1.Name = "小明";
s1.Class = clz;
s1.Age = ;
ctx.Students.Add(s1);
ctx.SaveChanges();
}
}

FluentAPI关系配置深入

1. 建议在多的一端进行配置,从数据库角度外键也是建在多的一端

public class StudentConfig:EntityTypeConfiguration<Student>
{
public StudentConfig() {
ToTable("T_Students");
//许多个学生只有一个班级,一个班级有需要个学生,外键是classId
HasRequired(e => e.Class).WithMany().HasForeignKey(e => e.ClassId);
}
//如果 ClassId 可空,那么就要写成 :
//this.HasOptional (s => s.Class).WithMany().HasForeignKey(s => s.ClassId)
}

2. 一对多的关系在一端配置就可以了,当然两边都配也不错。

3. 如果一张表中有两个指向另外一个表的外键怎么办?比如学生有“正常班级 Class”(不能空)和“小灶班级 XZClass”(可以空)两个班。如果用默认约定就会报错,怎么办?

this.HasRequired(s => s.Class).WithMany().HasForeignKey(s => s.ClassId);
this. HasOptional (s => s.XZClass).WithMany().HasForeignKey(s => s.XZClassId);

多VS多关系配置

class Student
{
public long Id { set; get; }
public string Name { get; set; }
public virtual ICollection<Teacher> Teachers { get; set; }=new List<Teacher>();
}
class Teacher
{
public long Id { set; get; }
public string Name { get; set; }
public virtual ICollection<Student> Students { get; set; }=new List< Student >();
}

实体对象

class StudentConfig : EntityTypeConfiguration<Student>
{
public StudentConfig()
{
ToTable("T_Students");
}
}
class TeacherConfig : EntityTypeConfiguration<Teacher>
{
public TeacherConfig()
{
ToTable("T_Teachers");
//多个老师对应多个学生,多个学生对应多个老师;map映射关系表,
//当前左键指的当前表
this.HasMany(e => e.Students).WithMany(e => e.Teachers)
.Map(m =>
m.ToTable("T_TeacherStudentRelations").MapLeftKey("TeacherId").MapRightKey("StudentId"));
}
}

这样不用中间表建实体(也可以为中间表建立一个实体,其实思路更清晰),就可以完

成多对多映射。当然如果中间关系表还想有其他字段,则要必须为中间表建立实体类。

FluentAPI关系映射配置的更多相关文章

  1. EF里一对一、一对多、多对多关系的配置和级联删除

    本章节开始了解EF的各种关系.如果你对EF里实体间的各种关系还不是很熟悉,可以看看我的思路,能帮你更快的理解. I.实体间一对一的关系 添加一个PersonPhoto类,表示用户照片类 /// < ...

  2. Entity Framework Code First关系映射约定

    本篇随笔目录: 1.外键列名默认约定 2.一对多关系 3.一对一关系 4.多对多关系 5.一对多自反关系 6.多对多自反关系 在关系数据库中,不同表之间往往不是全部都单独存在,而是相互存在关联的.两个 ...

  3. EF——一对一、一对多、多对多关系的配置和级联删除 04(转)

    EF里一对一.一对多.多对多关系的配置和级联删除   本章节开始了解EF的各种关系.如果你对EF里实体间的各种关系还不是很熟悉,可以看看我的思路,能帮你更快的理解. I.实体间一对一的关系 添加一个P ...

  4. Entity Framework Code First主外键关系映射约定

    本篇随笔目录: 1.外键列名默认约定 2.一对多关系 3.一对一关系 4.多对多关系 5.一对多自反关系 6.多对多自反关系 在关系数据库中,不同表之间往往不是全部都单独存在,而是相互存在关联的.两个 ...

  5. Entity Framework Code First关系映射约定【l转发】

    本篇随笔目录: 1.外键列名默认约定 2.一对多关系 3.一对一关系 4.多对多关系 5.一对多自反关系 6.多对多自反关系 在关系数据库中,不同表之间往往不是全部都单独存在,而是相互存在关联的.两个 ...

  6. EFCodeFirst关系映射约定

    EFCodeFirst关系映射约定 EFCodeFirst 关系映射约定 默认多重关系的一些约定规则: 1.一对多关系 两个类中分别包含一个引用和一个集合属性. 两个类中一个类包含另一个类的引用属性. ...

  7. MyBatis 关系映射XML配置

    关系映射 在我看来这些实体类就没啥太大关联关系,不就是一个sql语句解决的问题,直接多表查询就完事,程序将它设置关联就好 xml里面配置也是配置了sql语句,下面给出几个关系的小毛驴(xml) 一对多 ...

  8. $Django setting.py配置 ,GET、POST深入理解,三件套,orm对象关系映射简介

    1 django中app的概念: 大学:----------------- 项目  信息学院 ----------app01  物理学院-----------app02 ****强调***:创建的每一 ...

  9. Django---静态文件配置,post提交表单的csrf问题(日后细说),创建app子项目和分析其目录,ORM对象关系映射简介,Django操作orm(重点)

    Django---静态文件配置,post提交表单的csrf问题(日后细说),创建app子项目和分析其目录,ORM对象关系映射简介,Django操作orm(重点) 一丶Django的静态文件配置 #we ...

随机推荐

  1. Python 之 基础知识(四)

    一.公共方法(列表.元组.字典以及字符串) 1.内置函数 cmp函数取消可以用比较运算符来代替,但是字典是无序的,故而不可以用比较运算符比较. 2.切片(列表.元组.字符串适用) 3.运算符 列表中直 ...

  2. Kinect安装与配置(openNI2)

    原文链接:http://blog.csdn.net/chenxin_130/article/details/8580636 简介 最近OpenNI2的推出,小斤也要多给博客除除草了,并在闲暇之余做一些 ...

  3. 如何激活优动漫PAINT,获取优动漫PAINT序列号

    优动漫PAINT也就是我们常说的clip studio paint(CSP)的中文版本,它是一款功能强大的漫画.插画绘制软件,所有动漫和漫画插件使用帮助你更加便捷的创作有质量的二次元素材,是各位喜欢动 ...

  4. Javaee 方法的构建和调用

    主类: package Szy02; public class Person { String name; int age; String sex; public Person(){ } public ...

  5. JS 作业

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. spring重点一:处理对象创建时间 个数以及方式

    /** * 1) 对象创建: 单例/多例(个数) * scope="singleton", 默认值, 即 默认是单例 [service/dao/工具类] *  scope=&quo ...

  7. BZOJ 1305: [CQOI2009]dance跳舞 网络最大流_二分答案_建模

    Description 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲.有一些男孩女孩相互喜欢,而其他相互不喜欢(不会 ...

  8. Nginx+Keepalived(双机热备)搭建高可用负载均衡环境(HA)-转帖篇

    原文:https://my.oschina.net/xshuai/blog/917097 摘要: Nginx+Keepalived搭建高可用负载均衡环境(HA) http://blog.csdn.ne ...

  9. django创建第一个子文件夹

    1.首先安装python, 我安装了Python2.7的版本,安装在了D:\Python25\2.接着安装django,我下载了django 1.6的版本.3. 安装完了之后,打开cmd,然后可以检验 ...

  10. nlogn求逆序对&&陌上花开

    前置: nlogn逆序对: 前一个小时我还真的不会这个Orz 这里运用归并排序的思想. 对于一个序列,我们把它先分开,再合并成一个有序序列. 引自https://blog.csdn.net/qq_30 ...