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 ...
随机推荐
- C#自定义控件 绘制框
上几张测试的 效果 虽然全是用.net 的绘图库画的,但是手动双缓冲,不会闪烁,感觉还不错,源码开放了,喜欢的拿去扩展吧; 用于撤销的存放图像的数据结构我设置为10个,怕是内存崩了,我看mspaint ...
- Rreplication 性能差(转储200万门诊处方zjysb012)
ETLDB性能差(HIS转储200万门诊处方zjysb012) 解决方法: 1.禁用cdc.Hismz_capture 2.停止cdc.Hismz_capture 3.关闭zjysb012,zjysb ...
- Java探索之旅(13)——字符串类String
1.初始化 String类是Java预定义类,非基本类型而是引用类型. public class StudyString { public static void main(String[] args ...
- Arcane Numbers 1
Vance and Shackler like playing games. One day, they are playing a game called "arcane numbers& ...
- 【总结整理】JQuery基础学习---事件篇
jQuery鼠标事件之click与dbclick事件 用交互操作中,最简单直接的操作就是点击操作.jQuery提供了两个方法一个是click方法用于监听用户单击操作,另一个方法是dbclick方法用于 ...
- Python及R安装包版本查看方法
R包查询 查询已安装的所有的包:library() 或installed.packages()(括号内为空,区别以上两项) 查询具体包的信息: help(package="pheatmap& ...
- p4171&bzoj1823 满汉全席
传送门(洛谷) 传送门(bzoj) 题目 满汉全席是中国最丰盛的宴客菜肴,有许多种不同的材料透过满族或是汉族的料理方式,呈现在數量繁多的菜色之中.由于菜色众多而繁杂,只有极少數博学多闻技艺高超的厨师能 ...
- Linux awk指令详解
简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再 ...
- C# -- 继承规则
例子1--C#继承的常见问题: using System; using System.Collections.Generic; using System.Linq; using System.Text ...
- Redis源码分析-底层数据结构盘点
前段时间翻看了Redis的源代码(C语言版本,Git地址:https://github.com/antirez/redis), 过了一遍Redis数据结构,包括SDS.ADList.dict.ints ...