C#上下文当前未跟踪实体错误APi。关于更新方法

我是C#的新手,正在使用OData和Owinselfhost,问题是当我尝试对我的Object Person进行更新时总是收到此错误消息

The context is not currently tracking the entity

http://img2.mukewang.com/607a9a730001bb5208350103.jpg

我的控制器


    [HttpPut]

    [Route()]

    // PUT api/people/5 

    public IHttpActionResult Put([FromBody]Person value)

    {

        Console.WriteLine("Value updated " + value.LastName);

        var result = api.updatePerson(value);

        if (result == false)

            return BadRequest("An error occurred");

        return Ok("Person updated");

    }

API服务


 public bool updatePerson(Person p)

        {

            try

            {

                var ctx = GetAppControlContext();

                Person person = new Person();

                person = ctx.People.Where(ps => ps.Id == p.Id).SingleOrDefault();

                if (person != null)

                {

                    //person.FirstName = p.FirstName;

                    person = p;


                    Console.WriteLine("Name" + person.FirstName);                    

                    ctx.UpdateObject(person); 

                    ctx.SaveChanges();

                }


                Console.WriteLine("person updated");

                return true;

            }

            catch (Exception ex)

            {

                Console.WriteLine(ex.ToString());

                return false;

            }

        }

PS 只有当我像这样逐个字段分配给人时才起作用


 public bool updatePerson(Person p)

        {

            try

            {

                var ctx = GetAppControlContext();

                Person person = new Person();

                person = ctx.People.Where(ps => ps.Id == p.Id).SingleOrDefault();

                if (person != null)

                {

                  person.FirstName = p.FirstName;

                  person.LastName= p.LastName;

                  person.age= p.age;


                    Console.WriteLine("Name" + person.FirstName);                    

                    ctx.UpdateObject(person); 

                    ctx.SaveChanges();

                }





MM们
浏览 214回答 2
2回答

慕侠2389804

没错,仅当您单独分配每个字段时,代码才有效。因为Person是引用类型。您有两个的实例Person,p并且person这些变量只是指向您的实例的指针。当您编写时,person = p;两个指针都指向同一个实例,该实例未被您的上下文跟踪。因此,您需要分配每个字段,但是如果您拥有大量文件,则可以使用它AutoMapper来简化您的工作。
打开App,查看更多内容
随时随地看视频慕课网APP