先上测试代码

    public class User    {public int ID { get; set; }

public int BillingAddressID { get; set; }public Address BillingAddress { get; set; }public IList<Shipment> Shipments { get; set; }    }

public class Address    {public int ID { get; set; }public string Street { get; set; }public string City { get; set; }public string ZipCode { get; set; }

    }

public class Shipment    {public int ID { get; set; }public string State { get; set; }public int DeliveryAddressID { get; set; }

public Address DeliveryAddress { get; set; }

public User ShipUser { get; set; }//[ForeignKey("ShipUser")]        public int ShipUserID { get; set; }//public int UserId { get; set; }    }

public class TestContext : DbContext    {public DbSet<User> Users { get; set; }public DbSet<Address> Addresses { get; set; }public DbSet<Shipment> Shipments { get; set; }

protected override void OnModelCreating(DbModelBuilder modelBuilder)        {            modelBuilder.Entity<Shipment>().HasRequired(u => u.ShipUser)                .WithMany(d => d.Shipments)                .HasForeignKey(c => c.ShipUserID)                .WillCascadeOnDelete(false);        }    }

上面代码是能成功建库,并新增数据的最终版。

下面通过修改会报各种各样的错误

1、去掉OnModelCreating重载方法

  报错:

SqlException: Introducing FOREIGN KEY constraint 'FK_Shipments_Users_ShipUserID' on table 'Shipments' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.Could not create constraint. See previous errors.

 分析原因:EF创建的FK默认是带级联的

  

  因为SqlServer并不是真正运行去校验是否循环或多重级联,而是通过一个级联路径(可能与Name有关系)

  如果主键列不叫ID,也没有问题,但这样EF在建库时,会自动创建一列外键列(如ShipUser_UserID在代码中看不到)

转载于:https://www.cnblogs.com/wangcl/archive/2012/03/27/2419943.html

知其然不知其所以然的悲惨后果【EF CodeFirst 实体关系两日游】相关推荐

  1. 知其然不知其所以然 系列

    http://blog.csdn.net/chenyu105/article/category/947337 转载于:https://www.cnblogs.com/zengkefu/p/637224 ...

  2. 终于明白那些年知其然而不知其所以然的iOS内存管理方式

    终于明白那些年知其然而不知其所以然的iOS内存管理方式 前言 从我开始学习iOS的时候,身边的朋友.网上的博客都告诉我iOS的内存管理是依靠引用计数的,然后说引用计数大于1则对象保存在内存的堆中而引用 ...

  3. 知其然而不知其所以然

    知其然而不知其所以然 [词 目]知其然而不知其所以然 [读 音]zhī qí rán ér bù zhī qí suǒ yǐ rán [释 义]然:这样,如此.知道是这样,但不知道为什么是这样.只知道 ...

  4. 招商银行的“金融+知识”:知其然,更要知其所以然

    一个更加成熟.健康的金融市场,需要更加成熟.理性的用户来焕发勃勃生机:一个具备公信力的金融机构所做出的持续化.专业化金融知识输出,也将大大增加与用户之间的连接和信任. 这种相互成就的关系,正是服务1亿 ...

  5. 感想篇:7)知其然与知其所以然,KnowHow与KnowWhy

    本章目的:探究--知其然与知其所以然,KnowHow与KnowWhy. 1.Know-How体系与代价: 100多年的汽车研发历史表明,企业只有开发过两代车以上才能逐步建立和完善Know-How体系. ...

  6. 知其然,知其所以然之Java基础系列(一)

    相信大家在最初接触Java基础学习的时候,也只是跟着课本上的描述学习,知其然,不知所以然,要想成为一个Java老鸟,不仅要学会怎么用,也要知道为何这么用.在Java基础系列的博客中,我会列举一系列大家 ...

  7. 苏州蜗牛面试感想 ------- 知其然而不知其所以然

    今天去面试了..公司环境不错..挺个性的...氛围也不错... 两个面试管  给我感觉一个比较随和 另外一个比较严肃... 弄的我蛮紧张的 由于公司是游戏开发 问了一些线程. 程序设计,,还有设计模式 ...

  8. No.2第一章 启航 | Flink 知其然,知其所以然

    |文末 点击[在看]留言 反馈 | Flink知其然部分共有三个章节,其中 第一章 启航 部分会 从Flink的应用场景切入,让大家清楚的判断自己的业务场景是否适合使用Flink,同时介绍Flink的 ...

  9. 判断传值字符串是否为空【白丁水笔知其然】

    先浪一句,代码在下 为了知其然,实例要放前.为了所以然,解释放中间.为了ps:,备注最后面. 判断字符串是否为空 实例代码 //以下三种状态都能过滤 String abc = null;//第一种空 ...

最新文章

  1. 网络摄像头+net_今日 Paper | 神经网络结构搜索;视觉目标;人物识别;视频3D人体姿态估计等...
  2. linux修改重传次数,聊一聊重传次数
  3. JavaScript基本资料
  4. Python大数据处理扩展库pySpark用法精要
  5. MySQL 性能优化的 9 种方式
  6. 超详细深度学习debug指南,国外小哥手把手教你如何调试模型 | 附PPT
  7. python怎么运行yaml配置文件_python的技巧和方法你了解多少?
  8. 静态HTML模板渲染
  9. mysql审计audit插件_MySQL5.7 (审计)安装audit审计插件
  10. matlab的otdr仿真,OTDR仿真分析软件
  11. VS201-无法打开源文件hpp(或链接库文件)的解决方法
  12. 163邮箱注册登录官网是什么?163邮箱登陆流程在这里
  13. 微信公众号迁移公证书需要哪些材料?账号迁移流程来了
  14. 批量PDF文件合并用什么软件?这两个宝藏软件赶快收藏起来
  15. jQuery基础:选择器、动画、DOM操作和事件等
  16. Gatekeeper代码导读
  17. python字符串与十六进制互相转换
  18. 自定义ImageView实现播放帧动画
  19. 安装官方 Synaptics 驱动,终于解决 HP Pavilion G4 笔记本 讨厌的触摸板锁定问题!
  20. WI-FI LOGO认证学习记录

热门文章

  1. python安装unittest_python 自动化测试 (一):安装 requests,unittest,HTMLTestRunner
  2. 用什么写php最好用,php用什么开发工具比较好
  3. 框架生成的HTML修改,Django框架form表单验证 修改html标签的样式
  4. 《系统集成项目管理工程师》必背100个知识点-50质量控制的活动
  5. 笔记-信息化与系统集成技术-云计算的服务形式(IaaS/PaaS/SaaS/DaaS)
  6. 项目管理一般知识:典型的信息系统项目的生命周期模型
  7. CentOS配置启动ssh与开机自启
  8. Android中实现保存和读取文本文件到内部存储器(实现简易的记事本为例)
  9. Java中使用Jedis连接Redis对SortedSet进行排序操作
  10. C#中使用Path、Directory、Split、Substring实现对文件路径和文件名的常用操作实例