update remove mvc many framework collection entity-framework entity

entity-framework - remove - update collection entity framework



Actualizar objetos del marco de la entidad (5)

El siguiente código actualizará una entidad EF 4 que se ha creado como un parámetro de controlador en MVC desde una vista fuertemente tipada:

Parece que el truco es usar ObjectStateManager para cambiar el estado de Agregado a Modificado una vez que la entidad se haya agregado al contexto.

MyEntities db = new MyEntities(); db.Product.AddObject(product); db.ObjectStateManager.ChangeObjectState(product, System.Data.EntityState.Modified); return db.SaveChanges() > 0;

Según el comentario de @Sean Mills si está utilizando EF5:

((IObjectContextAdapter) db).ObjectContext.ObjectStateManager.ChangeObjectState(entity, System.Data.EntityState.Added);

Transfiero datos entre el marco de la entidad y la capa empresarial y la capa de usuario mediante el uso de objetos de transferencia de datos. Tengo algunas dudas, si recupero un objeto que se convierte a DTO, ¿cómo actualizo el objeto correcto en el marco de la entidad y no solo inserto un duplicado?


Esto debería funcionar para EF 5: https://.com/a/11749716/540802 :

db.Entry(product).State = EntityState.Modified;


Necesitará incluir una clave principal o alternativa en el DTO, luego hacer coincidir esa clave con la entidad EF correcta al actualizar.


una vieja pregunta, pero en caso de que alguien necesite una solución de código:

http://www.mikesdotnetting.com/Article/110/ASP.NET-MVC-Entity-Framework-Modifying-One-to-Many-and-Many-to-Many-Relationships

Ejemplo:

public void EditArticle( Article article, string articleTypeId, string[] categoryId) { var id = 0; Article art = de.ArticleSet .Include("ArticleTypes") .Include("Categories") .Where(a => a.ArticleID == article.ArticleID) .First(); var count = art.Categories.Count; for (var i = 0; i < count; i++) { art.Categories.Remove(art.Categories.ElementAt(i)); count--; } foreach (var c in categoryId) { id = int.Parse(c); Category category = de.CategorySet .Where(ct => ct.CategoryID == id).First(); art.Categories.Add(category); } art.Headline = article.Headline; art.Abstract = article.Abstract; art.Maintext = article.Maintext; art.DateAmended = DateTime.Now; art.ArticleTypesReference.EntityKey = new EntityKey( "DotnettingEntities.ArticleTypeSet", "ArticleTypeID", int.Parse(articleTypeId) ); de.SaveChanges(); }


//I am replacing player :) public ActionResult ProductEdit(string Id, Product product) { int IdInt = DecyrptParameter(Id); MyEntities db = new MyEntities(); var productToDetach = db.Products.FirstOrDefault(p=> p.Id == IdInt); if (product == null) throw new Exception("Product already deleted"); //I check if exists, maybe additional check if authorised to edit db.Detach(productToDetach); db.AttachTo("Products", product); db.ObjectStateManager.ChangeObjectState(product, System.Data.EntityState.Modified); db.SaveChanges(); ViewData["Result"] = 1; // successful result return View(); }