TryUpdateModel, Entity Framework, а почему не работает обновление? - PullRequest
0 голосов
/ 17 августа 2011

Я использую Entity Framework для работы с моей базой данных, и, поскольку я много гуглил, я наткнулся на какое-то решение, касающееся обновления моих сущностей, вот метод расширения для обновления сущности кода:

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

ИВот код для сохранения или добавления нового объекта:

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

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

    en.SaveChanges();
}

И, наконец, этот код, который я использую для обновления сущности своей категории в 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);

Но, к сожалению, этоне работает для обновления какой-либо категории, и я могу только создать новую.

1 Ответ

1 голос
/ 18 августа 2011

В вашем хранилище вы можете создать функцию обновления и установить состояние объекта в измененное состояние.

public abstract class Repository<T>
{    
   public void Update(T entity) {
        Context.Entry(entity).State = EntityState.Modified;
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...