#c# #entity-framework-6
#c# #entity-framework-6
Вопрос:
У меня есть 3 таблицы
Оператор OperatorWarehouse Warehouse
| Operators | | OperatorsWarehouses | | Warehouses |
| OperatorID | - | OperatorID | - | WarehouseID |
| EmployeeID | | WarehouseID | | Warehouse |
Итак, в основном в моей entity framework таблица «OperatorsWarehouses» не отображается…
В таблице складов уже есть данные, мне нужно только вставить в Operators и OperatorsWarehouses, чтобы установить связь.
Это мой код
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());
Но это будет вставлено в таблицу складов, а я не хочу этого делать, я хочу вставить только оператор в эту таблицу
Комментарии:
1. выполните запрос по складам, а затем назначьте ему соответствующий оператор .
2. Извините, не могли бы вы привести мне пример? Я пока мало что знаю о linq
3. или для оператора запросить хранилища и добавить их в свою коллекцию ,
4. var kettleWarehouse = db.Warehouses.find(f=>f.id==1); оператор. Склады.добавить (kettleWarehouse); то, что вы делаете, это добавляете новый склад, и ef делает это за вас….
5. если вам нужно добавить уже существующий склад оператору, вы должны предоставить существующий идентификатор для этого склада, если идентификатор склада равен 0 , ef рассматривает его как новый склад …
Ответ №1:
Вы должны указать идентификатор склада оператора, если добавляемый вами склад имеет 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();
}
Комментарии:
1. Просто чтобы сообщить, что это не работает при добавлении оператора, выдается исключение о невозможности вставить исходные значения или что-то в этом роде. Вместо этого я попробовал с этим — var warehouse= db.Warehouse. Find(warehouseID); оператор. Склад. Добавить(хранилище); —
2. это зависит от сценария вашего приложения, является ли ваша программа настольным приложением или веб-приложением? на основе сценария вы переходите к подключенному и отключенному DbContext, если он отключен, вам следует использовать метод attach и присоединить хранилище, прежде чем добавлять его к оператору и вызывать savechanges.
3. это веб-приложение, но я действительно даже не знал, что есть что-то вроде attach
4. не беспокойтесь, читайте о несвязанных и связанных ситуациях и графиках объектов в ef.
Ответ №2:
Добавьте [NotMapped]
в вашу таблицу определений :
Что-то вроде этого
[NotMapped]
public List<Warehouse> Warehouses;
Ответ №3:
Entity framework скроет таблицу связей, когда это «чистая» связь «многие ко многим». Таким образом, вы не будете просматривать таблицу OperatorsWarehouses, она будет обработана EF.
Чтобы добавить связи, вы просто добавляете сущности к сущностям, поэтому вы можете добавить оператора на склад или вы можете добавить склад к оператору.
В вашем конкретном случае вам нужно будет добавить существующий склад к оператору или существующего оператора к хранилищу. Что-то вроде этого:
int whId = 1; //warehouse with id 1
db.Warehouses.FirstOrDefault(x => x.WarehouseID ==
whId ).Operators.Add(operator);
примечание: будьте осторожны с FirstOrDefault, который вернет null, если нет хранилища с идентификатором 1