Entity Framework méthode de mise à Jour pour objet de collection
J'ai un problème avec la mise à jour de l'entité en DB. Je suis en utilisant Entity Framework Code First.
J'ai un petit programme de calcul de la nourriture.
Mes classes de domaine>
public class Unit
{
public int Id { get; set; }
public string Name { get; set; }
}
public abstract class Item
{
public int Id { get; set; }
public string Name { get; set; }
}
public class Ingredient : Item
{
public virtual Unit Unit { get; set; }
public decimal Price { get; set; }
}
public class Recipe : Item
{
public virtual List<RecipeItem> Items { get; set; }
public double WeightCoocked { get; set; }
public bool IsAlsoIngredient { get; set; }
}
public class RecipeItem
{
public int Id { get; set; }
public virtual Item Item { get; set; }
public int Quantity { get; set; }
}
Note seulement que RecipeItem peut être l'Ingrédient mais aussi Recette, donc je peux inclure recette en recette.
J'ai essayé ce genre de mises à jour de méthodes:
public void Update1(Recipe recipe)
{
if (recipe == null)
return;
var originalRecipe = DataContext.Recipes.FirstOrDefault(i => i.Id == recipe.Id);
if (originalRecipe == null)
return;
DataContext.Entry(originalRecipe).CurrentValues.SetValues(recipe);
DataContext.SaveChanges();
}
Update1 fonctionne, mais ma collection n'est pas mis à jour.
public void Update2(Recipe recipe)
{
if (recipe == null)
return;
var originalRecipe = DataContext.Recipes.FirstOrDefault(i => i.Id == recipe.Id);
if (originalRecipe == null)
return;
DataContext.Entry(originalRecipe).State = EntityState.Modified;
DataContext.SaveChanges();
}
Update1 fonctionne même comme Update1 mais si je change de collection, j'ai exception.
J'ai aussi essayé de mettre cette ligne
DataContext.Entry(originalRecipe.Items).State = EntityState.Modified;
Dernière mise à Jour de la méthode>
public void Update3(Recipe recipe)
{
if (recipe == null)
return;
var originalRecipe = DataContext.Recipes.FirstOrDefault(i => i.Id == recipe.Id);
if (originalRecipe == null)
return;
DataContext.Recipes.Attach(recipe);
DataContext.Entry(originalRecipe).State = EntityState.Modified;
DataContext.Entry(originalRecipe.Items).State = EntityState.Modified;
DataContext.SaveChanges();
}
Se même exception:
Un objet avec la même clé existe déjà dans le Vousmanager. Le Vousmanager ne peut suivre plusieurs objets avec la même clé.
Je n'ai pas de problème avec la mise à jour de tables> Unités et les Ingrédients, mais avec de la collection qui me rend nerveux. J'ai déjà regardé des vidéos de youtube sur EF sur pluralsight, mais il n'y a pas d'exemple que j'ai.
Merci pour votre aide.
Vous devez vous connecter pour publier un commentaire.
Vous êtes mauvais usage de ce Entity Framework est conçu pour. Généralement, c'est une bonne idée de charger une entité, de le modifier (en laissant le joint DbContext suivre les changements pour vous), alors qu'il détecte si des modifications ont été apportées. Si ce n'est pas possible (ce qui, je présume que vous avez posé cette question), alors votre meilleur pari est de mapper les propriétés des entités à partir d'un objet à un autre. Vous aurez besoin de faire cela pour chaque entité dans les entités liées à la trop.
En aparté, j'ai utilisé
SingleOrDefault
au lieu deFirstOrDefault
.Si vous voulez faire de cette cartographie automatiquement ensuite, regardez quelque chose comme AutoMapper qui vous permet d'associer des objets entre eux.
Essayer cette