EntityFramework多对多初始化

时间:2021-10-02 19:47:36

public class Order
{
  public virtual Guid OrderID {get;set;}
  public virtual ICollection<Menu> Menus {get;set;}
}

public class Menu
{
  public virtual Guid MenuID {get;set;}
  public virtual ICollection<Order> Orders {get;set;}
  public virtual int Price {get;set;}
}

比如是这样的两个实体

Order order = new Order();
order.OrderID = Guid.NewGuid();
//How to create?
//order.Menus = new List<Menu>();
order.Menus.Add(menu1);
order.Menus.Add(menu2);
order.Menus.Add(menu3);
order.Menus.Add(menu4);
dataContext.Orders.Add(order);
dataContext.SaveChanges();

创建一个订单,放入N个菜单,再保存进数据库
但是这样那些menu1~4存不进数据库
要new一个dataContext重新从数据库里读这个Order才能添加Menu,何解?

8 个解决方案

#1


当然不会更新了,没有源,如何执行更新

#2


引用 1 楼 FoxDave 的回复:
当然不会更新了,没有源,如何执行更新

如何才能?

#3


引用 1 楼 FoxDave 的回复:
当然不会更新了,没有源,如何执行更新

menu1~4是已存在数据库里的

#4


有生成中间表没有。menu1-4有实例化吧。

#5


引用 4 楼 highplayer 的回复:
有生成中间表没有。menu1-4有实例化吧。

这个中间表什么意思?不是EF自动生成的么?
我这里是Code First
menu1~4是从EF里读出来的。

#6


引用 4 楼 highplayer 的回复:
有生成中间表没有。menu1-4有实例化吧。

用order.Menus = new List<Menu>();无法给EF中间表存入menu1~4。

#7


引用 5 楼 ZIP_xG 的回复:
引用 4 楼 highplayer 的回复:有生成中间表没有。menu1-4有实例化吧。
这个中间表什么意思?不是EF自动生成的么?
我这里是Code First
menu1~4是从EF里读出来的。

两个表的多对多是要通过一个中间表来存储的,你看看数据库里的,会多一张类似OrderMenu的表吧。

既然menu1~4已经在数据库里了,怎么可能再存一遍呢?EF会在中间表中将menu1~4的ID与其关联的OrderID存入。

#8


引用 7 楼 highplayer 的回复:
引用 5 楼 ZIP_xG 的回复:引用 4 楼 highplayer 的回复:有生成中间表没有。menu1-4有实例化吧。
这个中间表什么意思?不是EF自动生成的么?
我这里是Code First
menu1~4是从EF里读出来的。
两个表的多对多是要通过一个中间表来存储的,你看看数据库里的,会多一张类似OrderMenu的表吧。

既然menu1~4已经在……

多对多就是这样用的吧
我发现解决方法了。
实体要用对应的DbSet<>的Create()方法来创建,这样里面的ICollection就会有EF来生成。
吸取教训,以后实体都要用EF来创建。。。

#1


当然不会更新了,没有源,如何执行更新

#2


引用 1 楼 FoxDave 的回复:
当然不会更新了,没有源,如何执行更新

如何才能?

#3


引用 1 楼 FoxDave 的回复:
当然不会更新了,没有源,如何执行更新

menu1~4是已存在数据库里的

#4


有生成中间表没有。menu1-4有实例化吧。

#5


引用 4 楼 highplayer 的回复:
有生成中间表没有。menu1-4有实例化吧。

这个中间表什么意思?不是EF自动生成的么?
我这里是Code First
menu1~4是从EF里读出来的。

#6


引用 4 楼 highplayer 的回复:
有生成中间表没有。menu1-4有实例化吧。

用order.Menus = new List<Menu>();无法给EF中间表存入menu1~4。

#7


引用 5 楼 ZIP_xG 的回复:
引用 4 楼 highplayer 的回复:有生成中间表没有。menu1-4有实例化吧。
这个中间表什么意思?不是EF自动生成的么?
我这里是Code First
menu1~4是从EF里读出来的。

两个表的多对多是要通过一个中间表来存储的,你看看数据库里的,会多一张类似OrderMenu的表吧。

既然menu1~4已经在数据库里了,怎么可能再存一遍呢?EF会在中间表中将menu1~4的ID与其关联的OrderID存入。

#8


引用 7 楼 highplayer 的回复:
引用 5 楼 ZIP_xG 的回复:引用 4 楼 highplayer 的回复:有生成中间表没有。menu1-4有实例化吧。
这个中间表什么意思?不是EF自动生成的么?
我这里是Code First
menu1~4是从EF里读出来的。
两个表的多对多是要通过一个中间表来存储的,你看看数据库里的,会多一张类似OrderMenu的表吧。

既然menu1~4已经在……

多对多就是这样用的吧
我发现解决方法了。
实体要用对应的DbSet<>的Create()方法来创建,这样里面的ICollection就会有EF来生成。
吸取教训,以后实体都要用EF来创建。。。