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中断开和连接的情况和对象图。