博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
FluentAPI关系映射配置
阅读量:4314 次
发布时间:2019-06-06

本文共 4271 字,大约阅读时间需要 14 分钟。

都有哪几种关系?

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
Students { get; set; } = new List
(); }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
{ public ClassConfig() { ToTable("T_Classes"); }}public class StudentConfig:EntityTypeConfiguration
{ public StudentConfig() { ToTable("T_Students"); }}
public class TestContent:DbContext    {        public TestContent() : base("name=connStr")        {            Database.SetInitializer
(null); } protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Configurations.AddFromAssembly(Assembly.GetExecutingAssembly()); } public DbSet
Classes { get; set; } public DbSet
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 = 18;                ctx.Students.Add(s1);                ctx.SaveChanges();}}

FluentAPI关系配置深入

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

public class StudentConfig:EntityTypeConfiguration
{ 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
Teachers { get; set; }=new List
();}class Teacher{public long Id { set; get; }public string Name { get; set; }public virtual ICollection
Students { get; set; }=new List< Student >();}
实体对象
class StudentConfig : EntityTypeConfiguration
{public StudentConfig(){ToTable("T_Students");}}class TeacherConfig : EntityTypeConfiguration
{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"));}}

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

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

转载于:https://www.cnblogs.com/cuijl/p/6739754.html

你可能感兴趣的文章
Git学习系列-Git基本概念
查看>>
c#多个程序集使用app.config 的解决办法
查看>>
Linux+Apache+PHP+MySQL服务器环境配置(CentOS篇)
查看>>
Linux下获取本机IP地址的代码
查看>>
(C#)调用Webservice,提示远程服务器返回错误(500)内部服务器错误
查看>>
flex布局
查看>>
python-----python的文件操作
查看>>
java Graphics2d消除锯齿,使字体平滑显示
查看>>
控件中添加的成员变量value和control的区别
查看>>
Spring Boot Docker 实战
查看>>
Div Vertical Menu ver3
查看>>
Git简明操作
查看>>
InnoDB为什么要使用auto_Increment
查看>>
课堂练习之买书打折最便宜
查看>>
定义函数
查看>>
网络虚拟化技术(二): TUN/TAP MACVLAN MACVTAP
查看>>
MQTT协议笔记之mqtt.io项目HTTP协议支持
查看>>
(转)jQuery中append(),prepend()与after(),before()的区别
查看>>
Tecplot: Legend和图像中 Dashed/Dash dot/Long dash 等虚线显示没有区别的问题
查看>>
蜕变成蝶~Linux设备驱动之异步通知和异步I/O
查看>>