¿Cómo actualizo el valor de la clave foránea de un objeto con LINQ a las entidades?
-
05-07-2019 - |
Pregunta
Supongamos que tengo estas tablas:
Fruits
- FruitID INT PK
- FruitName NVARCHAR(30)
- FruitStatusID INT FK: Statuses
Statuses
- StatusID INT PK
- StatusName NVARCHAR(30)
¿Cómo actualizo el nombre y el estado del Fruit en la base de datos en estas situaciones ?:
- Actualiza un pedazo de fruta que vino de una llamada L2E anterior
- dado un entero correspondiente a FruitID (es decir, no tengo un objeto Fruit completo en la mano para empezar)
VB o C # está bien, gracias!
Solución
Esto funciona pero no es lo que esperaba:
int StatusID = 4; // Some ID
Fruit.FruidIDReference.EntityKey =
New EntityKey("MyEntities.Statuses", "StatusID", StatusID)
Seguramente hay una forma más limpia de hacerlo que no requiere cadenas de codificación (lo que introduce excepciones en tiempo de ejecución si hago un error tipográfico).
Otros consejos
Si un objeto Fruit se pasa a otro método, puede:
-
Pase una referencia al objeto de contexto junto con el Fruit y llame a SaveChanges ()
-
Realice sus modificaciones al objeto Fruit en el método de nivel inferior y llame a SaveChanges () en el método de llamada (puede verificar si se ha modificado si desea evitar llamadas de base de datos innecesarias).
Código:
//Change the name
FruitEntities fe = new FruitEntities();
Fruit f = fe.Friuts.First();
f.FruitName = "NewName";
fe.SaveChanges();
//Get a fruit by ID and change the status
//Statuses will need to be included as an Entity in your model with an association to Fruits
int Id = 2;
int newStatusID = 0;
FruitEntities fe = new FruitEntities();
Fruit f = (from x in fe.Fruits
where x.FruitID == Id
select x).First();
Status s = (from y in fe.Statuses
where y.StatusID = newStatusID
select y).First();
f.Status = s;
fe.SaveChanges();