EF5+MVC4系列(1) Podwerdesigner15.1设计数据库;PD中间表和EF实体模型设计器生成中间表的区别;EF5.0 表关系插入数据(一对多,多对多)
在上一篇文章中, http://www.cnblogs.com/joeylee/p/3790980.html 我们用 PD15.1 来设计了数据库,并且生成 了sql数据库,现在我们用 vs2013来试试 用 ModeFirst模式来设计数据库,并且生成数据库, 在PD中的表结构如下

下面我们用 vs2013来设计一下

创建2个表,并且在空白地方 新增 关联 为 一对多



我们根据这个模型,来生成数据库看看


点击生成后,我们看到 数据库里面表已经生成. 而且还生成了外键.

下面我们来把剩下的几个表来弄完.
先添加 部门表和 用户部门关系表(自己手动创建的中间表) 如下

然后我们添加关系, 用户 与 用户部门表 是 一对多, 部门和 用户部门表 也是一对多


完成如下

最后我们把 活动表添加进来

活动表和部门表是 多对多关系,用EF来表现出来

最后如下

现在,我们点击空白地方,根据EF实体模型来生成数据库 (注意,重新生成的sql脚本里面有 drop删除表命令,要小心你之前的数据)


我们可以看到,EF会帮我们把 部门和 活动表 的多对多关系,自动的帮我们创建一张中间表.
一:添加一对多的关系 userinfo 表 和 order 表
下面我们简单的来在EF中,添加1个用户,两个订单,并且关联他们一对多的关系
下面是正确的代码
static void YiDuiDuo()
{
//1.1 创建1个用户(可以使用2种不同的方式,保存到上下文)
UserInfo userinfo1 = new UserInfo { UserName = "老李1" }; db.UserInfo.Add(userinfo1); //这是第1种方式添加实体到数据库的上下文里面
//db.Entry(userinfo1).State = EntityState.Added; //这是第2种方式 //1.2 创建4个订单(并使用2种不同的方式,保存到上下文)
Order order1 = new Order { Content = "这是订单1", CreateTime = DateTime.Now };
Order order2 = new Order { Content = "这是订单2", CreateTime = DateTime.Now };
Order order3 = new Order { Content = "这是订单3", CreateTime = DateTime.Now }; db.Order.Add(order1); //第1种方式添加到数据库的上下文
db.Order.Add(order2);
db.Order.Add(order3);
db.Entry(order3).State = EntityState.Added; //第2钟方式添加到数据库的上下文 db.SaveChanges(); //1.3 添加用户1和订单1,2,3的关联
userinfo1.Order.Add(order1); //从用户方面,直接添加订单
order2.UserInfoId = userinfo1.Id; //从订单方面,根据订单里面的 用户id这个外键,来设置(注意,这里的userinfo1.Id看起来是等于0,实际在运行的时候,会赋值成真正的id值)
order3.UserInfo = userinfo1; //从订单方面,根据订单里面的 导航属性,来设置 //1.5 保存上面所有的操作到数据库
db.SaveChanges();
Console.WriteLine("保存成功"); }
注意上面的订单表和用户表关联的3种不同的写法
1:userinfo1.Order.Add(order1); //从用户方面,直接添加订单
2:order2.UserInfoId = userinfo1.Id; //从订单方面,根据订单里面的 用户id这个外键,来设置(注意,这里的userinfo1.Id看起来是等于0,实际在运行的时候,会赋值成真正的id值)
3:order3.UserInfo = userinfo1; //从订单方面,根据订单里面的 导航属性,来设置

最后数据库生成的数据为

特殊情况:
原本我是准备先添加2个用户,6个订单,然后用户1分别和订单1,2,3关联, 用户2和订单4,5,6 关联的时候,总是提示报错
无法确定“Model.UserInfoOrder”关系的主体端。添加的多个实体可能主键相同,具体请看
EF报错 无法确定“XXX”关系的主体端。添加的多个实体可能主键相同
于是,只能先放弃一次添加多个实体主键的关系,采用先添加用户1,关联订单1,2,3这样的方式来添加,就正确了
二:添加多对多表的关系(自己手动创建的中间表)
用户表 用户部门关系表 部门表 这3张表的数据的关联



代码如下//1.1 创建1个用户(可以使用2种不同的方式,保存到上下文)
UserInfo userinfo1 = new UserInfo { UserName = "李大叔" }; db.UserInfo.Add(userinfo1); //这是第1种方式添加实体到数据库的上下文里面
//db.Entry(userinfo1).State = EntityState.Added; //这是第2种方式 //1.2 创建2个部门
Department dep1 = new Department { DepName = "开发部" };
Department dep2 = new Department { DepName = "人力资源部" }; db.Department.Add(dep1); //第1种方式添加到数据库的上下文
db.Entry(dep2).State = EntityState.Added; //第2钟方式添加到数据库的上下文 db.SaveChanges(); //这里提前保存部门1和部门2,是为了防止报错 无法确定“XXX”关系的主体端。添加的多个实体可能主键相同 //1.3 把用户1,添加到 部门1 通过中间表里面 外键属性,来关联这3个表
R_UserInfo_Dep userinfo_dep1 = new R_UserInfo_Dep
{
Jointime = DateTime.Now,
UserInfoId=userinfo1.Id,
DepartmentId=dep1.Id
};
//1.4 再把用户1,添加到部门2, 通过中间表里面的 导航属性,来关联这3个表
R_UserInfo_Dep userinfo_dep2 = new R_UserInfo_Dep
{
Jointime = DateTime.Now,
UserInfo = userinfo1,
Department = dep2
}; db.R_UserInfo_Dep.Add(userinfo_dep1); //第一种添加到上下文的方式
db.Entry(userinfo_dep2).State = EntityState.Added; //第二种添加到上下文的方式
//1.5 保存上面所有的操作到数据库
db.SaveChanges();
Console.WriteLine("保存成功");
数据库查询结果

三:添加多对多表的关系 (系统自动生成的表)
这次我们直接用上一步添加的2个部门表,就不新增部门表了,但是我们新增2个活动,然后2个部门都参加这2个活动,我们要在代码里面完成他们的关系



完整代码如下 //1.1 创建2个活动(可以使用2种不同的方式,保存到上下文)
Play play1 = new Play { PlayTime = Convert.ToDateTime("2013-07-05"), PlayContent = "公司聚会活动" };
Play play2 = new Play { PlayTime = Convert.ToDateTime("2013-06-18"), PlayContent = "京东狂欢节" };
db.Play.Add(play1);
db.Entry(play2).State = EntityState.Added; //1.2 从数据库里面查询出现在的2个部门,这2个部门,都参加上面是2个活动 var query = db.Department; //这里我们先看看查询条件最后会变成什么
var deps = query.ToList();
foreach (var item in deps)
{
play1.Department.Add(item);
play2.Department.Add(item);
} //1.3 保存上面所有的操作到数据库
db.SaveChanges();
Console.WriteLine("保存成功");
最后数据库的查询结果是

ok 那么这节到此为止
EF5+MVC4系列(1) Podwerdesigner15.1设计数据库;PD中间表和EF实体模型设计器生成中间表的区别;EF5.0 表关系插入数据(一对多,多对多)的更多相关文章
- EF5+MVC4系列(12) 在主视图中直接用RenderAction调用子Action,并返回视图(Return View)或者分部视图(Return PartialView); 从主Action传值到子Action使用TempData传值;TempData高级用法
结论: ViewData 适用于 在一次请求中 传递数据 . 比如我们从 主Action 到 主视图, 然后在 主视图中 用 RenderAction 请求子Action的时候,就是算作 一次请求 ...
- EF5+MVC4系列(11)在主视图中用Html.RenderPartial调用分部视图(ViewDate传值);在主视图中按钮用ajax调用子action并在子action中使用return PartialView返回分布视图(return view ,return PartialView区别)
一:主视图中使用Html.RenderPartial来调用子视图(注意,这里是直接调用子视图,而没有去调用子Action ) 在没有使用母版页的主视图中(也就是设置了layout为null的视图中), ...
- vs2017 出现“文件中的类都不能进行设计,因此未能为该文件显示设计器”问题处理
今天拷贝了以前的一个项目.打算出一个新版本. 但是拷贝了sln文件后,去除掉以前的项目,新增了一个 winfrom项目中 出现了:文件中的类都不能进行设计,因此未能为该文件显示设计器.错误 百度了一 ...
- C# 文件里的类不能进行设计,因此未能为该文件显示设计器
C# 文件里的类不能进行设计,因此未能为该文件显示设计器 vs 一直打不开设计界面 仅仅能查看代码界面 这时候须要查看 代码中 是不是 从 form 继承 假设不是 窗口类型 改为 fo ...
- EF5+MVC4系列(8) ActionResult的返回值
我们在MVC的代码中,经常会看到这样的一个 代码 可能有人会有疑问,既然我定义的是ActionResult,为什么返回值会是View方法呢? 其实这个View方法的返回值的类型是ActionResul ...
- EF5+MVC4系列(7) 后台SelectListItem传值给前台显示Select下拉框;后台Action接收浏览器传值的4种方式; 后台Action向前台View视图传递数据的四种方式(ViewDate,TempDate,ViewBag,Model (实际是ViewDate.Model传值))
一:后台使用SelectListItem 传值给前台显示Select下拉框 我们先来看数据库的订单表,里面有3条订单,他们的用户id对应了 UserInfo用户表的数据,现在我们要做的是添加一个Ord ...
- EF5+MVC4系列(6) 简单三层的搭配(泛型) 实现 增删改查
1:项目结构 2:每层添加对其他层的引用,这里我们把除了Web层之外的所有的层生成的文件都放到解决方案下的Library文件夹下,然后每个项目分别来引用里面的dll项目文件. 我们在Model项目上, ...
- EF5+MVC4系列(5) 删除的方法 1:系统推荐的先查询后remove删除的方法 2:自己new一个包含主键的类,然后 attach附加 remove删除;3:使用db.Entry 修改状态删除4:EntityState的几种状态
我们还是以订单表为例 1:系统推荐的方法,先查询出来,然后调用remove方法进行删除 我们删除id大于等于4的 static void Main(string[] args) { Delet ...
- EF5+MVC4系列(2) EF5报错 无法确定“XXX”关系的主体端。添加的多个实体可能主键相同
情景:用户表和订单表是一对多的关系,即 一个 Userinfo 对应对应有 多个 Order表 如果我在EF中,先创建一个用户,然后创建3个订单,然后关联这1个用户和3个订单的关系,毫无问题. ...
随机推荐
- TortoiseSVN checkout 之后图标(绿色勾之类的)没有显示出来的问题
http://blog.csdn.net/xigu_233/article/details/44595547 ********************************************* ...
- s3c2440内存控制器与SDRAM基本测试
前面我们实验的LED和串口程序,是cpu发送地址给特定的寄存器,在寄存器中写相应的位,达到控制要求. 第一类是GPIO门电路如LED,第二类是协议类如串口,这些都不是cpu直接给地址信息,而是通过寄存 ...
- 【C++程序员学 python】python 的文件类型
python的文件类型主要分为3种,分别是源代码.字节代码和优化代码.这些代码都可以直接运行,不需要进行编译或者连接.这正是python语言的特性,python的文件通过python.exe 或pyt ...
- ARKit从入门到精通(3)-ARKit自定义实现
转载:http://blog.csdn.net/u013263917/article/details/73038566 在上一小节中ARKit从入门到精通(2)-ARKit工作原理及流程介绍,我们完整 ...
- div模态显示内容
业务需要,上传的图片,本地显示大图: 模态代码: <div onclick="hidebigimg()" class = "bg-model" style ...
- JedisConnectionPool scala
/** * Created by lq on 2017/8/29. */ object JedisConnectionPool { val config = new JedisPoolConfig() ...
- 阿里云 Caused by: redis.clients.jedis.exceptions.JedisDataException: ERR invalid password
如果你是买的阿里云的redis服务的话,不要被这个ERR invalid password所迷惑了. 你应该去检查一下你买的服务有没有设置白名单. 像mysql和mongodb的服务如果连不上的话也可 ...
- mongo的身份验证和授权
问题来源 刚装好的mongo,准备登陆进去测一把的,结果就给我报这个错,鄙人是新手,还不太清楚这个,现学一下~ Mongo的身份验证 在上一篇安装mongo的博客中(https://www.cnblo ...
- 利用jQuery中live为动态生成Dom添加datepicker效果
利用Live属性,focus时重新绑定控件 $(".datepickerDom").live("focus", function () { $(this).da ...
- [ADC]TI am4378 ADC采样设置问题(am335x类似)
这段时间在调试AM4378的ADC问题,发现采样到的数据和真实输入波形有所出入,比如输入是1ms的周期,50%占空比的信号,但是采样的数据描点总是偏差较大,数据如下 iio device number ...