Entity framework 7通过代码添加外键关系的方法
这几天研究Asp.net5,也试着写了一些示例代码,因为网上的资料实在是太少了,所以在此把一些问题的解决方法记录下来,以备后查。
问题:
在EF7中,假如数据库已经存在,并且两个表具有外键关系,但是实际数据库中并没有加上这个约束,如何处理?
比如,我们有一个公司表,具有两个字段,id和name,如下所示:
public class Branch
{ /// <summary>
/// 公司ID
/// </summary>
[Key]
public string ID { get; set; } /// <summary>
/// 公司名称
/// </summary>
public string Name { get; set; }
}
另外具有一个区域表,如下:
public class AreaInfo
{ [Key]
public string AreaID { get; set; } public string BranchID { get; set; } public string Name { get; set; } public virtual Branch Branch { get; set; } }
区域表中,BranchID为逻辑上的外键,对应branch的ID。
如果需要通过代码来创建外键关系可以这样操作:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
var branchEntity = modelBuilder.Entity<Branch>().ToTable("BranchInfo");
var areaEntity = modelBuilder.Entity<AreaInfo>().ToTable("AreaInfo"); var id = branchEntity.Metadata.FindProperty("ID");
var branchKey = branchEntity.Metadata.FindKey(id);
var branchProp = areaEntity.Metadata.FindProperty("BranchID");
areaEntity.Metadata.GetOrAddForeignKey(branchProp, branchKey, branchKey.DeclaringEntityType); base.OnModelCreating(modelBuilder);
}
分别解释如下:
首先取得公司表的主键,
var id = branchEntity.Metadata.FindProperty("ID");
然后,根据主键属性取得主键:
var branchKey = branchEntity.Metadata.FindKey(id);
接着是取得主表,既区域表的外键属性:
var branchProp = areaEntity.Metadata.FindProperty("BranchID");
最后就是把外键属性和对应表的主键关联起来:
areaEntity.Metadata.GetOrAddForeignKey(branchProp, branchKey, branchKey.DeclaringEntityType);
这样,就通过代码建立起来了外键关系。
当然,最后通过
areaEntity.Metadata.AddForeignKey(branchProp, branchKey, branchKey.DeclaringEntityType);
这行代码添加关系也可以。
Entity framework 7通过代码添加外键关系的方法的更多相关文章
- Entity Framework 一个表多个外键关联另外一张表的相同主键
一. 报错 异常:System.Data.Entity.Infrastructure.DbUpdateException: 更新条目时出错.有关详细信息,请参阅内部异常. ---> System ...
- SQL server 建立标后,执行代码添加外键
alter table dbo.student add constraint FK_tstudent_class foreign key(classno) references dbo.class(c ...
- Entity Framework Code First主外键关系映射约定
本篇随笔目录: 1.外键列名默认约定 2.一对多关系 3.一对一关系 4.多对多关系 5.一对多自反关系 6.多对多自反关系 在关系数据库中,不同表之间往往不是全部都单独存在,而是相互存在关联的.两个 ...
- Entity Framework 实体间的外键关系
EF 默认是开户级联删除的,这此规则将会删除非空外键和多对多的关系,如果 在数据库上下文中的实体模型类 存在着 级联引用和多重删除路径,那么EF就抛出 级联引用和多重删除路径的异常. Introduc ...
- 使用Entity Framework 4进行代码优先开发
[原文地址]Code-First Development with Entity Framework 4 .NET 4随带发布了一个改进版的Entity Framework(EF)- 一个位于Sy ...
- PowerDesigner 12小技巧-pd小技巧-pd工具栏不见了-pd修改外键命名规则-pd添加外键
PowerDesigner 12小技巧-pd小技巧-pd工具栏不见了-pd修改外键命名规则-pd添加外键 1. 附加:工具栏不见了 调色板(Palette)快捷工具栏不见了PowerDesigner ...
- Mysql添加外键约束
简单说一下使用外键的好处 1.完整性约束 比如:用户表中有字段 用户编号(id) , 名称(username)设备表中有字段 设备编号(id) , 设备名称(devicename) 设备属于的用户编号 ...
- SQL - 添加外键
不解释: ---先创建外键的column ALTER TABLE tblLicenses ADD ProductID int not null; ---添加外键 ALTER TABLE tblLice ...
- MySQL添加外键的方法
为book表添加外键: <1>明确指定外键的名称: 语法:alter table 表名 add constraint 外键的名称 foreign key(你的外键字段名) REFERENC ...
随机推荐
- Linux 文件名颜色
在Linux中,文件的颜色都是有含义的.其中, 蓝色表示目录 绿色表示可执行文件 红色表示压缩文件 浅蓝色表示链接文件 灰色表示其它文件 红色闪烁表示链接的文件有问题了 黄色是设备文件,包括block ...
- C语言学习笔记--C语言中的逗号表达式
逗号表达式:exp1,exp2,epx3,...,expN; (1)逗号表达式是 C 语言中的“粘贴剂” (2)逗号表达式用于将多个子表达式连接为一个表达式 (3)逗号表达式的值为最后一个子表达式的值 ...
- shell判断网络主机存活
判断网络主机存活企业面试题4:写一个脚本,实现判断10.0.0.0/24网络里,当前在线用户的IP有哪些(方法有很多) #!/bin/sh#[ -f /etc/init.d/functions ] & ...
- Robot Framework 接口自动化介绍
接口测试的重要性大家应该都清楚,就不多说了,本文中主要介绍接口测试如何在robot framework自动化测试框架中进行. 一.环境依赖 1.安装robot framework环境,本文中不做讲解 ...
- 具体问题:3、hibernate跟Mybatis/ ibatis 的区别,为什么选择?
第一章 Hibernate与MyBatis Hibernate 是当前最流行的O/R mapping框架,它出身于sf.net,现在已经成为Jboss的一部分. Mybatis 是另外一种优秀 ...
- 12、多空格&多制表符文本之cut域分割终极方案
解决方法分为如下三步: (1) 使用“tr”命令将制表符转换为空格: (2) 使用“tr”命令将多个重复空格删除,保留一个空格: (3) 使用“cut”命令进 ...
- python调用Linux下so文件
1.通过C语言编写一个简单max函数,生成一个max.so链接库 /* * # -shared 为链接库 让编译器知道是要编译一个共享库 * # -fPIC(Position Independent ...
- 20169201 使用Metaspoit攻击MS08-067实验
MS08-067漏洞介绍 MS08-067漏洞的全称为"Windows Server服务RPC请求缓冲区溢出漏洞",如果用户在受影响的系统上收到特制的 RPC 请求,则该漏洞可能允 ...
- 【mybatis-SqlSession的方法总结】
SqlSession 实例在 MyBatis 中是非常强大的一个类.SqlSession 实例中有所有执行语句的方法,提交或回滚事务,还有获取映射器实例. 在 SqlSession 类中有超过 20 ...
- C# 字节转换
1.字符串与字节数组 System.Text.Encoding.UTF-8.GetBytes() 汉字转换后3个字节,数字转换和数字位数一样 GetString() 2.Int32值类型与字节数组 B ...