tnblog
首页
视频
资源
登录

Code First 配置外键 一对多 多对多

6884人阅读 2021/3/26 17:54 总访问:124039 评论:0 收藏:0 手机
分类: MVC
  1.  
  2.  
  3. ? 配置外键
  4.  
  5.  
  6. 一:导航属性
  7. 外键字段在模型中没有,没法自己去控制联和查询只能使用导航属性
  8. //子表
  9. namespace Model
  10. {
  11.     [Table("UserInfo")]
  12.     public class UserInfo
  13.     {
  14.         [Key]
  15.         public int id { getset; }
  16.         [Required]
  17.         public string UserName { getset; }
  18.         [StringLength(32), Required]
  19.         public string Number { getset; }
  20.         //1外键添加
  21.         public virtual Userparent userparent { getset; }
  22.     }
  23. }
  24. 主表
  25. namespace Model
  26. {
  27.    public class Userparent
  28.     {
  29.         public int Id { getset; }
  30.         public string Father { getset; }
  31.         public string Mother { getset; }
  32.         public virtual List<UserInfo> users { getset; }
  33.     }
  34. }
  35. 二:导航属性+自定义属性
  36.    1:    //[Table("UserInfo")]
  37.     public class UserInfo
  38.     {
  39.         [Key]
  40.         public int id { getset; }
  41.         [Required]
  42.        public string UserName { getset; }
  43.         [StringLength(32), Required]
  44.         public string Number { getset; }
  45.  
  46.         //1外键
  47.         [ForeignKey("userparent")]
  48.         public int UserparentId { getset; }
  49.         public virtual Userparent userparent { getset; }
  50.     }
  51.  
  52.  
  53.   
  54.   2
  55.   [Table("UserInfo")]
  56.     public class UserInfo
  57.    {
  58.        [Key]
  59.         public int id { getset; }
  60.         [Required]
  61.        public string UserName { getset; }
  62.         [StringLength(32), Required]
  63.        public string Number { getset; }
  64.  
  65.         //2外键  
  66.         public int UserparentId { getset; }
  67.             [ForeignKey("UserparentId ")]
  68.         public virtual Userparent userparent { getset; }
  69.     }
  70.  
  71. 三:在上下文对象中重写模型创建,使用fluent api
  72. 级联删除
  73. Ef code first默认开启级联删除,从你删除的表,当做主表,把相关的数据全部删除。
  74.  
  75.   //方法一对多来配置
  76.    //虚方法
  77.         protected override void OnModelCreating(DbModelBuilder modelBuilder)
  78.         {
  79.                  //一对多来配置后面不加.WillCascadeOnDelete(false)默认开启联表删除
  80.             modelBuilder.Entity<UserInfo>().HasRequired(a => a.userparent).WithMany(a => a.users).HasForeignKey(a => a.UserparentId);
  81.  
  82.             //方法多对一来配置
  83.             modelBuilder.Entity<多的对象名称>().HasMany(a => a.users 多的对象需配置的链接字段 ).WithRequired(a => a.userparent 少的对象须配置的链接字段).HasForeignKey(a => a.UserparentId 少的字段最终确认链接字段 );
  84.  
  85.             modelBuilder.Entity<Userparent>().HasMany(a => a.users).WithRequired(a => a.userparent).HasForeignKey(a => a.UserparentId).WillCascadeOnDelete(false);
  86.  
  87.             //如果关闭级联删除在后面加.WillCascadeOnDelete(false)
  88.             //fales表示的是关闭联级删除
  89.             //true表示的是打开
  90.                         //全部关闭
  91.             modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
  92.  
  93.                         //生成的表去掉自动生成的后缀名s
  94.             modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
  95.  
  96.     级联删除的关闭或者开启
  97.     1:只删除或者关闭某两个表的关系
  98.   modelBuilder.Entity<Userparent>().HasMany(a => a.users).WithRequired(a => a.userparent).HasForeignKey(a => a.UserparentId).WillCascadeOnDelete(false);
  99.  }
  100. 建议用法:在需要的表加.WillCascadeOnDelete(false); 如果用全局可能会造成数据不小心全部删除
  101.  
  102.   [Table("UserInfo")]
  103.     public class UserInfo
  104.     {
  105.         [Key]
  106.         public int id { getset; }
  107.         [Required]
  108.         public string UserName { getset; }
  109.         [StringLength(32), Required]
  110.         public string Number { getset; }
  111.  
  112.         //3利用虚方法外键
  113.         public int UserparentId { getset; }
  114.         public virtual Userparent userparent { getset; }
  115. }
  116.  
  117.  
  118. namespace DAL
  119. {
  120.     public class ShopContext : DbContext
  121.     {
  122.         public ShopContext()
  123.             : base("name=ShopEetities")
  124.         {
  125.  
  126.         }
  127.         //虚方法
  128.         protected override void OnModelCreating(DbModelBuilder modelBuilder)
  129.         {
  130.             //方法一配置1的一方
  131.             //modelBuilder.Entity<UserInfo>().HasRequired(a => a.userparent).WithMany(a => a.users).HasForeignKey(a => a.UserparentId);
  132.             //方法二配置多的一方
  133.             //modelBuilder.Entity<多的对象名称>().HasMany(a => a.users 多的对象需配置的链接字段 ).WithRequired(a => a.userparent 少的对象须配置的链接字段).HasForeignKey(a => a.UserparentId 少的字段最终确认链接字段 );
  134.             modelBuilder.Entity<Userparent>().HasMany(a => a.users).WithRequired(a => a.userparent).HasForeignKey(a => a.UserparentId);      
  135.         }
  136.         public DbSet<UserInfo> UserInfo { getset; }
  137.         public DbSet<Userparent> Userparent { getset; }
  138.     }
  139. }
  140.  
  141.  
  142. 配置多对多
  143.  
  144. 学生    课程
  145. 1       多
  146. 多      1
  147.  
  148. 多对多关系,应该有一个中间表,用于关联,关联表至少两个字段,就是两张表的id
  149.  
  150.  
  151.  
  152. l  导航属性
  153. 只需要在相关联的表增加对方的表名就可以自动生成关系如
  154.     public class UserInfo
  155.     {
  156.         [Key]
  157.         public int id { getset; }
  158.         [Required]
  159.         public string UserName { getset; }
  160.         [StringLength(32), Required]
  161.         public string Number { getset; }
  162.         //3利用虚方法外键
  163.         public int UserparentId { getset; }
  164.         public virtual Userparent userparent { getset; }
  165. //相关联的字段
  166.         public virtual List<Sub 相关联的表名> Coress { getset; }
  167. }
  168.  
  169.    public  class Sub
  170.     {
  171.         public int Id { getset; }
  172.         public string Cores { getset; }
  173. //相关联的字段
  174.         public virtual List<UserInfo 相关联的表名> userinfos { getset; }
  175.  
  176.     }
  177. l  使用fluentApi
  178. 更灵活,关联表的表名,两个外键可以自己灵活控制
  179. l  配置多对多
  180.  
  181. //配置生成的一张新表表示关系  
  182. 1.   ToTable(自定义新表表名); 
  183. 2.   MapLeftKey(自定义用户的关联字段); 
  184. 3.   MapRightKey(自定义成绩关联的字段);
  185.  
  186.             modelBuilder.Entity<UserInfo>().HasMany(a => a.Coress).WithMany(a => a.userinfos).Map(a =>
  187.             {
  188.                 a.ToTable("UserInfo_Sub");
  189.                 a.MapLeftKey("UserId");
  190.                 a.MapRightKey("SubId");
  191.             });
  192.  
  193. l  自己维护
  194. 最灵活的,不仅可以自己控制表名外键名,还可以自己维护对象已经其他其他字段。
  195. (多对多其实可以理解成两个1对多。可以拆分成两个多对多)
  196.  
  197.  
  198. ? 数据库迁移
  199. Enable-Migrations启用数据库迁移
  200. Enable-Migrations –EnableAutomaticMigrations 启动自动迁移
  201. Update-Database 更新到数据库


评价

NET Core 使用 EF Code First

下面这些内容很老了看这篇:https://www.tnblog.net/aojiancc2/article/details/5365 项目使用多层,把数据库访问...

Code First执行命令报错,无法将“Enable-Migrations”项识别为 cmdlet、函数、脚本文件

EF:执行命令报错无法将“Enable-Migrations”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如...

EF Code First常用命令

Enable-Migrations启用数据库迁移Enable-Migrations –EnableAutomaticMigrations 启动自动迁移Add-Migration Name(名字可...

EF Code First 多对多关系配置

Code First配置多对多关系,常规有两种方法例如我们有一张学生表,和一张课程表,学生和课程是一个多对多的关系方法1:单纯...

EF Code First配置1对多关系,配置外键关系

方法一:通过默认名称,导航属性名称+主表主键注意这个是属性不是字段!,要加get,set可能会因为很久没有用,就忘记了,写...

EF Code First操作数据库具体步奏

创建两个类库,分别一个实体类Model,一个帮助类DAL用于操作数据库配置在实体层类添加属性和字段用于创建数据库的表,同时添加...

Code First迁移命令

Enable-Migrations启用数据库迁移Enable-Migrations –EnableAutomaticMigrations 启动自动迁移Update-Database 更新到数据...

EF Code First配置唯一约束

在EntityFramework 6.1后可以直接使用:[Index(&quot;TitleIndex&quot;,IsUnique=true)] publicstringTitle{get;set;}在旧...

Core EF Code First-黑色主题效果

[TOC] 创建好实体Student类: public class Student { public int ID { get; set; } public string LastName ...

.NET CORE EF数据库迁移,以及迁移命令详解。Code First。在不删除表的情况下保持同步

.NET CORE EF 数据库迁移需要的依赖Install-Package Microsoft.EntityFrameworkCore.SqlServer -version 3.1.1 Install-Pa...

Code First 基础

第一步:创建好实体第二步:创建上下文对象第三步;实体对象与上下文进行关联第四步:配置连接字符串第五步SaveChanges写入...

Code First 创建

第一步:创建好实体 如 限制条件如果写出来没有应用可以去在该类库中添加一个ADO.NET实体数据模型 然后建立一个空模型,...

Code First添加外键约束

实体对象进行关联(给学生表定义外键)//学生表实体 publicpartialclassUserInfo { [Key] publicintSid{get;set;} [St...

Code First 配置多对多关系

配置多对多关系,应该有一个中间表,用于关联,关联表至少两个字段,就是两张表的id//默认导航属性 //先定义一个中间表 ...

Code First 分组

根据linq表达式//实例化数据 SchoolContextschoolcontext=newSchoolContext(); //linq表达式 varInfo=fromscroeinsc...
.
排名
28
文章
25
粉丝
8
评论
0
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术