Entity Framework (отношения между двумя объектами не могут быть определены) - PullRequest
1 голос
/ 19 декабря 2011

Я пытаюсь выполнить следующий код на веб-странице ASP .Net:

  using (var wpe = new CL40215_wpnEntities())
                {
                int cid = Convert.ToInt32(cmbCity.SelectedItem.Value);
                int catid = Convert.ToInt32(cmbCategory.SelectedValue);

             Post p = new Post
             {
                 title = txtTitle.Text,
                 description = txtDescription.Text,
                 User = u,
                 City = wpe.Cities.First(c => c.id == cid),
                 initialprice = 0,
                 finalprice = 10,
                 Category = wpe.Categories.First(c => c.id == catid),
                 postdate = DateTime.Now,
                 closedate = DateTime.Now.AddDays(Convert.ToInt32(cmbDays.SelectedValue)),
                currentprice = 1
             };
                wpe.AddToPosts(p);
                wpe.SaveChanges();
 }

Однако я получаю следующую ошибку:

Невозможно определить отношения между двумя объектами, поскольку они прикреплены к разным объектам ObjectContext.

Кто-нибудь знает, почему это происходит, и как решить эту проблему?

Ответы [ 2 ]

1 голос
/ 19 декабря 2011

Одной из возможных проблем является u со ссылкой на User. Я не понимаю, откуда это взялось, и действительно возможно, что u происходит из другого контекста.

1 голос
/ 19 декабря 2011

Попробуйте изменить инициализацию объекта, чтобы сначала прикрепить объект публикации, а затем создать связь.

    var category = wpe.Categories.First(c => c.id == catid);
    var city = wpe.Cities.First(c => c.id == cid);
    var user = wpe.Users.First(newU => newU.Id == u.Id);
    Post p = new Post
    {
        title = txtTitle.Text,
        description = txtDescription.Text,
        initialprice = 0,
        finalprice = 10,
        postdate = DateTime.Now,
        closedate = DateTime.Now.AddDays(Convert.ToInt32(cmbDays.SelectedValue)),
        currentprice = 1
    };
    wpe.AddToPosts(p);
    p.City = city;
    p.Category = category;
    p.User = user;

    wpe.SaveChanges();

Если вы используете постоянные классы, они должны знать друг о друге, прежде чем могут быть созданы отношения. Это означает, что вам нужно либо отсоединить дочерние элементы перед созданием объекта, а затем сначала присоединить их всех дочерних элементов, либо, как указано выше, сначала прикрепить новую запись. Не уверен, что делает ваш репозиторий addtoposts, но это должно сработать, если вы не выполняете изменения сохранения до того, как объект станет действительным.

РЕДАКТИРОВАТЬ: Извинения. Я не заметил добавление объекта пользователя. Вам нужно будет либо перезагрузить пользователя с текущим контекстом, либо ОТКЛЮЧИТЬ пользователя от его предыдущего контекста и ПОДКЛЮЧИТЬ его к текущему.

...