У меня есть WCF-Rest Service, как вы можете видеть:

 [OperationContract]
        [WebInvoke(Method = "PUT", UriTemplate = "/EditNews", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        bool Edit(News entity);

С этим кодом:

public class NewsRepository :INewsRepository
    {
        private readonly DataContext _ctx;
        public NewsRepository(DataContext ctx)
        {
            _ctx = ctx;

        }

        public bool Add(News entity)
        {
            try
            {
                _ctx.News.Add(entity);
                _ctx.SaveChanges();
                return true;
            }
            catch (Exception ex)
            {
                // TODO log this error
                return false;
            }
        }

        public bool Edit(News entity)
        {
            try
            {

                _ctx.Entry(entity).State = System.Data.Entity.EntityState.Modified;
                _ctx.SaveChanges();
                return true;
            }
            catch (Exception ex)
            {
                // TODO log this error
                return false;
            }
        }
}}

Поэтому я вызываю мой сервис в моем клиенте, чтобы отредактировать мою сущность, как вы можете видеть:

 News student = new News
            {
                Id = Guid.Parse("7320D87D-4819-4663-BCF9-2D09F9E4BD70"),
                Subject = "aaaaaaaaaaaaaassssssssssss",
                ViewerCounter = 3, // removed the "" (string)
                MainContent = "fsdsd", // renamed from "Content"
                SubmitDateTime = DateTime.Now,
                ModifiedDateTime = DateTime.Now,
                PublisherName = "sdaadasd",
                PictureAddress = "adfafsd",
                TypeOfNews = "bbbbb"
            };
            WebClient Proxy1 = new WebClient();
            Proxy1.Headers["Content-type"] = "application/json";
            MemoryStream ms = new MemoryStream();
            DataContractJsonSerializer serializerToUplaod = new DataContractJsonSerializer(typeof(News));
            serializerToUplaod.WriteObject(ms, student);
            byte[] a = Proxy1.UploadData("http://localhost:47026/NewsRepository.svc/EditNews", "PUT", ms.ToArray());

Поэтому я запускаю свой сервис и клиентское приложение и нажимаю на кнопку «Изменить», и моё редактирование работает. Но во второй раз я получаю эту ошибку в своем Edit method

Attaching an entity of type 'CMSManagement.Domain.Entity.News' failed because another entity of the same type already has the same primary key value. This can happen when using the 'Attach' method or setting the state of an entity to 'Unchanged' or 'Modified' if any entities in the graph have conflicting key values. This may be because some entities are new and have not yet received database-generated key values. In this case use the 'Add' method or the 'Added' entity state to track the graph and then set the state of non-new entities to 'Unchanged' or 'Modified' as appropriate.
0
Ehsan Akbar 29 Май 2017 в 07:42

2 ответа

Лучший ответ

Окончательное решение

  public bool Edit(News entity)
            {
                try
                {
                    News Edited = _ctx.News.Where(i => i.Id == entity.Id).First();
                    _ctx.Entry(Edited).CurrentValues.SetValues(entity);
                    _ctx.SaveChanges();
                    return true;
                }
                catch (Exception ex)
                {
                    // TODO log this error
                    return false;
                }
            }
0
Ehsan Akbar 29 Май 2017 в 10:22

Убедитесь, что к вашей модели новостей не прикреплены никакие другие объекты, возможно, она пытается добавить одну сущность, присоединенную к вашей новости, просто передайте ее без дочерних объектов и убедитесь, что вы использовали AsNoTracking() во время выбирая эту сущность.

1
Munzer 29 Май 2017 в 06:04