4
votes

Insérer dans la table des liens plusieurs à plusieurs dans Entity Framework

J'ai 3 tables

Opérateur Opérateur Warehouse

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

Donc fondamentalement dans mon framework d'entité, la table "OperatorsWarehouses" n'apparaît pas ...

Il y a déjà des données dans la table Warehouses, je il suffit d'insérer dans Operators and OperatorsWarehouses pour faire la relation.

Ceci est mon code

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();
}                    

J'ai déjà essayé

|   Operators   |     |   OperatorsWarehouses  |     |   Warehouses  |
|   OperatorID  |  -  |        OperatorID      |  -  |   WarehouseID |
|   EmployeeID  |     |        WarehouseID     |     |   Warehouse   |

Mais cela va s'insérer dans la table des entrepôts et je ne veux pas faire cela, je veux insérer uniquement l'opérateur sur cette table


7 commentaires

interrogez les entrepôts et attribuez-lui l'opérateur correspondant.


Pardon, pourriez-vous me donner un exemple? Je ne sais pas encore grand chose sur linq


ou pour l'opérateur interroge les entrepôts et l'ajoute à sa collection,


var kettleWarehouse = db.Warehouses.find (f => f.id == 1); operator.Warehouses.add (kettleWarehouse); ce que vous faites est d'ajouter un nouvel entrepôt et ef le fait pour vous ....


si vous devez ajouter un entrepôt déjà existant à un opérateur, vous devez fournir un identifiant existant pour son entrepôt, si l'identifiant de l'entrepôt est 0, ef le considère comme un nouvel entrepôt ...


Ah c'est génial, je ne savais pas que tout était automatique. J'ai réussi à faire cela avec: "var entrepôt = db.Warehouses.Find (1); operator.Warehouse.Add (entrepôt); il a inséré dans le tableau du milieu l'opérateur et l'entrepôt existant


a ajouté une réponse, si vous pensez que c'est utile, vous pouvez l'accepter ....


3 Réponses :


1
votes

Ajoutez [NotMapped] dans votre table de définition:

Quelque chose comme ça

[NotMapped]
public List<Warehouse> Warehouses;


0 commentaires

1
votes

Le cadre d'entité masquera la table des relations lorsqu'il s'agit d'une relation plusieurs à plusieurs "pure". Vous ne verrez donc pas le tableau OperatorsWarehouses , il sera géré par EF.

Pour ajouter des relations, il vous suffit d'ajouter des entités aux entités, vous pouvez donc ajouter un opérateur à un entrepôt ou vous pouvez ajouter un entrepôt à un opérateur.

Dans votre cas spécifique, vous devrez ajouter un entrepôt existant à l'opérateur, ou un opérateur existant à l'entrepôt. Quelque chose comme ceci:

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

note: faites attention au FirstOrDefault qui retournera null s'il n'y a pas d'entrepôt avec l'id 1


0 commentaires

2
votes

Vous devez fournir l'identifiant de l'entrepôt de l'opérateur, si l'entrepôt que vous ajoutez a 0 comme identifiant, il est considéré comme un nouvel entrepôt. vous pouvez ajouter une liste déroulante pour les entrepôts dans votre interface utilisateur que l'utilisateur sélectionne une fois qu'il ajoute un opérateur.

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();
}         


4 commentaires

Juste pour informer que cela ne fonctionne pas lors de l'ajout de l'opérateur, cela donne une exception concernant l'impossibilité d'insérer les valeurs d'origine ou quelque chose. J'ai essayé avec ceci à la place - var entrepôt = db.Warehouse.Find (WarehouseID); operator.Warehouse.Add (entrepôt); -


cela dépend du scénario de votre application, votre programme est-il une application de bureau ou une application Web? en fonction du scénario, vous arrivez à un DbContext connecté et déconnecté s'il est déconnecté, vous devez utiliser la méthode attach et attacher l'entrepôt avant de l'ajouter à l'opérateur et d'appeler savechanges.


c'est une application web mais je ne savais même pas qu'il y avait quelque chose comme attach


pas de soucis, lisez sur des situations déconnectées et connectées et des graphiques d'objets dans ef.