Babak Fakhriloo
Babak Fakhriloo

Reputation: 2126

TryUpdateModel, Entity Framework and why updating does not work?

I use Entity Framework to deal with my database, and as I googled a lot, I ran into some solution around updating my entities, here is extension method for updating entity the code :

public static void AttachUpdated(this ObjectContext context, EntityObject objectDetached)
{
   if (objectDetached.EntityState == EntityState.Detached)
   {
      object currentEntityInDb = null;

      if (context.TryGetObjectByKey(objectDetached.EntityKey, out currentEntityInDb))
      {
         context.ApplyPropertyChanges(objectDetached.EntityKey.EntitySetName, objectDetached);

         //(CDLTLL)Apply property changes to all referenced entities in context
         //Custom extensor method
         context.ApplyReferencePropertyChanges((IEntityWithRelationships)objectDetached,
                                               (IEntityWithRelationships)currentEntityInDb); 
       }
       else
       {
           throw new ObjectNotFoundException();
       }
    }
}

public static void ApplyReferencePropertyChanges(this ObjectContext context,
                                                 IEntityWithRelationships newEntity,
                                                 IEntityWithRelationships oldEntity)
{
   foreach (var relatedEnd in oldEntity.RelationshipManager.GetAllRelatedEnds())
   {
      var oldRef = relatedEnd as EntityReference;

      if (oldRef != null)
      {
         // this related end is a reference not a collection
         var newRef = newEntity.RelationshipManager.GetRelatedEnd(oldRef.RelationshipName, oldRef.TargetRoleName) as EntityReference;

         oldRef.EntityKey = newRef.EntityKey;
      }
   }
}

And here is the code for saving or adding new object :

public void save (Category obj)
{
    OurWebSiteEntities en = new OurWebSiteEntities();

    if (obj.CategoryID == -1)
    {
       en.AddToCategories(obj);
    }
    else
       en.AttachUpdated(obj);

    en.SaveChanges();
}

And finally this the code I use to update my category entity in asp.net mvc :

if (cat.Category.CategoryID == -1)
{
   // it is a new category
   // and needs some property initialization   
}
else
   catItem = _categoryRepo.Items.FirstOrDefault(x => x.CategoryID == cat.Category.CategoryID);

TryUpdateModel(catItem, "Category");

_categoryRepo.Save(catItem);

But unfortunately it does not work for updating any category, and I am only able to create new one.

Upvotes: 0

Views: 1146

Answers (1)

Efe Kaptan
Efe Kaptan

Reputation: 465

In your repository, you could create an update function and set entity state to modified.

public abstract class Repository<T>
{    
   public void Update(T entity) {
        Context.Entry(entity).State = EntityState.Modified;
   }
}

Upvotes: 1

Related Questions