EntityReference может иметь не более одного связанного объекта - PullRequest
0 голосов
/ 23 июля 2010

У меня есть два идентичных действия контроллера и два почти идентичных представления (у одного только есть другой файл javscript с этим). Один вид работает просто отлично, но другой зависает на этой ошибке EF:

A relationship multiplicity constraint violation occurred: An EntityReference can have no more than one related object, but the query returned more than one related object. This is a non-recoverable error.

Я понимаю ошибку, но она не имеет никакого смысла в контексте, особенно когда один вид работает, а другой нет. Вот немного из двух представлений, которые заставляют его задыхаться (это противно, но давайте пока проигнорируем это ...):

<% var x = ((IEnumerable<Project.Models.Booth>)ViewData["booths"]).Where(b => b.RowNumber == i && b.ColumnNumber == j && b.BoothGroupID == item.ID).FirstOrDefault(); %>

                        <%if ( x != null)
                          { %>
                            <td class="assigned" title="<%: x.BoothNumber %> - <%: x.Exhibitor.Name %>" style="width:<%: item.Width %>px; height:<%: item.Height %>px;"></td>
                        <%}
                          else
                          { %>
                            <td style="width:<%: item.Width %>px; height:<%: item.Height %>px;"></td>
                        <%} %>

Это действие контроллера для представления сведений, которое вызывает исключение:

public ActionResult Details(int id)
    {
        var results = from g in db.BoothGroups
                      where g.PlanID == id
                      select g;

        ViewData["id"] = id;

        var plan = (from p in db.Plans
                    where p.ID == id
                    select p).FirstOrDefault();

        ViewData["imagePath"] = "/plans/" + plan.Name.ToString().Replace(" ", "").ToLower() + "/" + plan.ImageFileName;

        var booths = from b in db.Booths
                     where b.PlanID == id
                     select b;

        ViewData["booths"] = booths;

        return View(results);
    }

Это действие контроллера для того, которое работает, есть дополнительный вызов для заполнения выпадающего списка из viewdata, но я удалил его, кажется, не влияет ни на одно представление, ни на другое.

public ActionResult EditAssignment(int id)
    {
        var results = from g in db.BoothGroups
                      where g.PlanID == id
                      select g;

        ViewData["id"] = id;

        var plan = (from p in db.Plans
                    where p.ID == id
                    select p).FirstOrDefault();

        ViewData["imagePath"] = "/plans/" + plan.Name.ToString().Replace(" ", "").ToLower() + "/" + plan.ImageFileName;

        var exhibitors = from e in db.Exhibitors
                         where e.MeetingCode == plan.MeetingCode
                         orderby e.Name
                         select e;

        ViewData["exhibitors"] = new SelectList(exhibitors, "ID", "Name");

        var booths = from b in db.Booths
                     where b.PlanID == id
                     select b;

        ViewData["booths"] = booths;

        return View(results);
    }

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

1 Ответ

3 голосов
/ 24 июля 2010

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

var results = (from g in db.BoothGroups
              where g.PlanID == id
              select g).ToList();

и

var booths = (from b in db.Booths
             where b.PlanID == id
             select b).ToList();

как таковой, вы передаете ObjectQuery вашему представлению, что может вызвать проблемы с отображением представления, поскольку ObjectContext может быть не в том состоянии, в котором он находился при выполнении запроса. Также проверьте моделируемые объекты и убедитесь, что они не вызывают БД изнутри.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...