Linq to Sql Help

Why am I getting an exception when ApplyPropertyChanges ???

When editing a custom table, the code is pretty much the same, but doesn't work with my news table.

Creation, deletion and details all work fine, but when I try to edit news, I get the below exception:

ObjectStateManager does not contain ObjectStateEntry 'MagixCMS.Models.noticia'

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace MagixCMS.Models
{
    public class NoticiaRepository : INoticiaRepository
    {
        #region INoticiaRepository Members

        magixcmsEntities _entities = new magixcmsEntities();

        public noticia CreateNoticia(noticia noticiaToCreate)
        {
            _entities.AddTonoticiaSet(noticiaToCreate);
            _entities.SaveChanges();
            return noticiaToCreate;
        }

        public void DeletaNoticia(noticia noticiaToDelete)
        {
            var noticiaOriginal = GetNoticia(noticiaToDelete.Id);
            _entities.DeleteObject(noticiaOriginal);
            _entities.SaveChanges();
        }

        public noticia EditNoticia(noticia noticiaToEdit)
        {
            var noticiaOriginal = GetNoticia(noticiaToEdit.Id);
            _entities.ApplyPropertyChanges(noticiaToEdit.EntityKey.EntitySetName, noticiaToEdit); //EXCEPTION HERE
            _entities.SaveChanges();
            return noticiaToEdit;
        }

        public noticia GetNoticia(int id)
        {
            return (from c in _entities.noticiaSet where c.Id == id select c).FirstOrDefault();
        }

        public IEnumerable<noticia> ListNoticias()
        {
            return _entities.noticiaSet.ToList();
        }

        #endregion
    }
}

      

I google the exception and didn't find much help.

0


a source to share


1 answer


I solve this.

The problem is with the EF model.

To solve this problem, you need an extension method to save your data:



using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Objects;
using System.Data.Objects.DataClasses;

namespace MagixCMS.Models
{
    public static class Extensions
    {
        public static void Update(ObjectContext context, string entitySetName, IEntityWithKey entity)
        {
            entity.EntityKey = context.CreateEntityKey(entitySetName, entity);
            context.Attach(entity);
            var stateEntry = context.ObjectStateManager.GetObjectStateEntry(entity.EntityKey);
            var propertyNameList = stateEntry.CurrentValues.DataRecordInfo.FieldMetadata.Select(pn => pn.FieldType.Name);
            foreach (var propName in propertyNameList)
            {
                stateEntry.SetModifiedProperty(propName);
            }
        }
    }
}

      

And in the Edit method, you do:

public noticia EditNoticia(noticia noticiaToEdit)
{
    //GET THE CONTEXT FOR THE ENTITY
    ObjectContext _context = this._entities.noticiaSet.Context;
    var noticiaOriginal = GetNoticia(noticiaToEdit.Id);
    //UPDATE THE ORIGINAL ENTITY WITH THE NEW VALUES
    Extensions.Update(_context, noticiaOriginal.EntityKey.EntitySetName, noticiaToEdit);
    //PERSIST THE DATA
    _entities.SaveChanges();
    return noticiaToEdit;
}

      

0


a source







All Articles