这几天研究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通过代码添加外键关系的方法的更多相关文章

  1. Entity Framework 一个表多个外键关联另外一张表的相同主键

    一. 报错 异常:System.Data.Entity.Infrastructure.DbUpdateException: 更新条目时出错.有关详细信息,请参阅内部异常. ---> System ...

  2. SQL server 建立标后,执行代码添加外键

    alter table dbo.student add constraint FK_tstudent_class foreign key(classno) references dbo.class(c ...

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

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

  4. Entity Framework 实体间的外键关系

    EF 默认是开户级联删除的,这此规则将会删除非空外键和多对多的关系,如果 在数据库上下文中的实体模型类 存在着 级联引用和多重删除路径,那么EF就抛出 级联引用和多重删除路径的异常. Introduc ...

  5. 使用Entity Framework 4进行代码优先开发

    [原文地址]Code-First Development with Entity Framework 4   .NET 4随带发布了一个改进版的Entity Framework(EF)- 一个位于Sy ...

  6. PowerDesigner 12小技巧-pd小技巧-pd工具栏不见了-pd修改外键命名规则-pd添加外键

    PowerDesigner 12小技巧-pd小技巧-pd工具栏不见了-pd修改外键命名规则-pd添加外键 1. 附加:工具栏不见了 调色板(Palette)快捷工具栏不见了PowerDesigner ...

  7. Mysql添加外键约束

    简单说一下使用外键的好处 1.完整性约束 比如:用户表中有字段 用户编号(id) , 名称(username)设备表中有字段 设备编号(id) , 设备名称(devicename) 设备属于的用户编号 ...

  8. SQL - 添加外键

    不解释: ---先创建外键的column ALTER TABLE tblLicenses ADD ProductID int not null; ---添加外键 ALTER TABLE tblLice ...

  9. MySQL添加外键的方法

    为book表添加外键: <1>明确指定外键的名称: 语法:alter table 表名 add constraint 外键的名称 foreign key(你的外键字段名) REFERENC ...

随机推荐

  1. bootstrap插件使用

    首先,针对导航栏(单页面导航插件(缓慢跳转)) 引入插件:jquery.singlePageNav.min.js   下载链接:http://pan.baidu.com/s/1jHBaQxg  密码: ...

  2. PopupWindow 防微信弹出右 侧窗体(继承PopupWindow )

    1, pop自定义 public class SelectPicPopupWindow extends PopupWindow { private Button btn_take_photo, btn ...

  3. Learning Python 011 高级特性 1

    Python 高级特性 1 切片 将L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']列表中前上个3个元素: L = ['Michael', 'Sarah ...

  4. Learning Python 006 list(列表) 和 tuple(元组)

    Python list(列表) 和 tuple(元组) list 列表 Python内置的一种数据结构.list:一种有序的集合,可以随时添加和删除其中的元素. list的用法 定义list > ...

  5. 再次总结Linux最常用命令

    cp,,mv,,rm,,rmdir,,mkdir,,more,,touch,,head,,tail,,pwd,, less  按q退出,空格翻页,回车 上下键滚动行 -N  显示行号 -S  行过长时 ...

  6. 【jeasyui5】样式:调整页面显示的顶部菜单和左侧菜单

    1.顶部菜单修改:修改index2.js里面的InitTopMenu方法,将icon +2 2.左侧菜单宽度调整: 修改index.html,加上width:170的定长 <!-- 左侧菜单 - ...

  7. 6.7 使用IDEA导入工程

    打开IDEA->File->new -> Project from existing ..->选择你的工程,导入: 请注意,在130或者40上面的项目并不是最新的,sunny也 ...

  8. Python开发【第六篇】:文件处理

    1. 文件   文件处理流程: 打开文件,获得文件句柄,并赋值 通过句柄对文件进行操作 关闭文件 1.1 打开文件   在 Python 中使用 open()函数打开文件,并返回文件对象: open( ...

  9. SpringBoot第六篇:整合通用Mapper

    作者:追梦1819 原文:https://www.cnblogs.com/yanfei1819/p/10876339.html 版权声明:本文为博主原创文章,转载请附上博文链接! 引言   在以往的项 ...

  10. Redis源码分析-底层数据结构盘点

    前段时间翻看了Redis的源代码(C语言版本,Git地址:https://github.com/antirez/redis), 过了一遍Redis数据结构,包括SDS.ADList.dict.ints ...