C# 在实体框架中的多对多链接表中插入

C# 在实体框架中的多对多链接表中插入,c#,entity-framework-6,C#,Entity Framework 6,我有三张桌子 接线员 操作员仓库 仓库 | Operators | | OperatorsWarehouses | | Warehouses | | OperatorID | - | OperatorID | - | WarehouseID | | EmployeeID | | WarehouseID | | Warehouse | 因此,基本上在我的实体框架中,“

我有三张桌子

接线员 操作员仓库 仓库

|   Operators   |     |   OperatorsWarehouses  |     |   Warehouses  |
|   OperatorID  |  -  |        OperatorID      |  -  |   WarehouseID |
|   EmployeeID  |     |        WarehouseID     |     |   Warehouse   |
因此,基本上在我的实体框架中,“OperatorsWarehouses”表不会出现

Warehouses表中已经有数据,我只需要在Operators和OperatorsWarehouse中插入数据即可建立关系

这是我的密码

using (InventoryContext db = new InventoryContext ())
{
   Employee employee = new Employee();
   employee.EmployeeID = Convert.ToInt32(ddlOperators.SelectedValue);

   var operator = new Operator();
   operator.EmployeeID = employee.EmployeeID ;

   db.Operator.Add(operator);
   db.SaveChanges();                       
   ddlOperators.DataBind();
}                    
我已经试过了

operator.Warehouses.Add(new Warehouse());

但这将在warehouses表中插入,我不想这样做,我只想在定义表中插入该表上的运算符

添加
[NotMapped]

像这样的

[NotMapped]
public List<Warehouse> Warehouses;
[未映射]
公开名单仓库;

当关系表是“纯”多对多关系时,实体框架将隐藏该关系表。因此,您将不会关闭运算符仓库表,它将由EF处理

要添加关系,您只需将实体添加到实体,这样您就可以将操作员添加到仓库,或者将仓库添加到操作员

using (InventoryContext db = new InventoryContext ())
 {
   Employee employee = new Employee();
   employee.EmployeeID = Convert.ToInt32(ddlOperators.SelectedValue);
   var wareHouseId = Convert.ToInt32(ddlWarehouses.SelectedValue);
   var operator = new Operator();
   operator.EmployeeID = employee.EmployeeID ;
   operator.Warehouses.add(new Warehouse(){Id=wareHouseId});
   db.Operator.Add(operator);

   db.SaveChanges();                       
   ddlOperators.DataBind();
}         
在您的特定情况下,您需要向操作员添加一个现有仓库,或向仓库添加一个现有操作员。大概是这样的:

 int whId = 1; //warehouse with id 1
 db.Warehouses.FirstOrDefault(x => x.WarehouseID ==
 whId ).Operators.Add(operator);

注意:请注意FirstOrDefault,如果没有id为1的仓库,它将返回null。您应该提供操作员的仓库id。如果要添加的仓库的id为0,则视为新仓库。 在用户添加操作员后,可以在用户界面中添加仓库下拉列表,供用户选择

using (InventoryContext db = new InventoryContext ())
 {
   Employee employee = new Employee();
   employee.EmployeeID = Convert.ToInt32(ddlOperators.SelectedValue);
   var wareHouseId = Convert.ToInt32(ddlWarehouses.SelectedValue);
   var operator = new Operator();
   operator.EmployeeID = employee.EmployeeID ;
   operator.Warehouses.add(new Warehouse(){Id=wareHouseId});
   db.Operator.Add(operator);

   db.SaveChanges();                       
   ddlOperators.DataBind();
}         

查询仓库,然后为其分配相应的操作员。对不起,您能给我举个例子吗?我对linq yetor了解不多,因为操作员查询仓库并将其添加到其集合中,var cattlewarehouse=db.warehouses.find(f=>f.id==1);操作员.仓库.添加(仓库);您正在做的是添加一个新仓库,ef会为您这样做……如果您需要向运营商添加一个已经存在的仓库,您必须为其仓库提供一个现有id,如果仓库id为0,ef会将其视为一个新仓库……只是为了告知在添加运营商时这不起作用,它给出了一个关于无法插入原始值或其他内容的异常。我改为尝试使用它--var warehouse=db.warehouse.Find(warehouseID);operator.Warehouse.Add(仓库)--这取决于你的应用场景,你的程序是桌面应用还是网络应用?根据场景,您会遇到一个已连接和已断开连接的DbContext如果它已断开连接,您应该使用attach方法连接仓库,然后再将其添加到操作员并调用savechanges。这是一个web应用程序,但我真的不知道有类似attachno的担心,阅读ef中断开和连接的情况和对象图。