在上一篇文章中, 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张表的数据的关联
代码如下
数据库查询结果
三:添加多对多表的关系 (系统自动生成的表)
这次我们直接用上一步添加的2个部门表,就不新增部门表了,但是我们新增2个活动,然后2个部门都参加这2个活动,我们要在代码里面完成他们的关系
完整代码如下
最后数据库的查询结果是
ok 那么这节到此为止