Entity Framework не сохраняет изменения для отношения один ко многим - PullRequest
0 голосов
/ 29 апреля 2020

Кажется, я не могу сэкономить часть своих уроков. Я использую Code First EF. Вот мои классы:

public class ClassA
{
    public int Id { get; set; }

    public string Name { get; set; }

    public virtual IList<Resource> Resources { get; set; }
}

public class Resource
{
    public int Id { get; set; }
    public string Role { get; set; }
    public Location Location { get; set; }

    public ClassA ClassA { get; set; }
}

public class Location
{
    public int Id { get; set; }
    public string Name { get; set; }
}

Мое представление редактирования имеет:

<table>
    <thead>
        <tr>
            <th class="shaded">
                @Html.Label("Level/Role")
            </th>
            <th class="shaded">
                @Html.Label("Location")
            </th>
        </tr>
    </thead>
    <tbody id="tbResources">
        @{
            for (int i = 0; i < Model.Resources.Count; i++)
            {
                <tr>
                    <td>
                        @Html.HiddenFor(model => model.Resources[i].Id)
                        @Html.EditorFor(model => model.Resources[i].Role, new { htmlAttributes = new { @class = "form-control" } })
                        @Html.ValidationMessageFor(model => model.Resources[i].Role, "", new { @class = "text-danger" })
                    </td>
                    <td>
                        @Html.DropDownListFor(model => model.Resources[i].Location.Id, new SelectList(ViewBag.AvailableLocations, "Id", "Name"), new { @class = "form-control" })
                    </td>
                </tr>
            }
        }
    </tbody>
</table>

Контроллер:

public ActionResult Edit(int? id)
{
    if (id == null)
    {
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    }
    ClassA classA = db.ClassAs.Find(id);
    if (classA == null)
    {
        return HttpNotFound();
    }

    ViewBag.AvailableLocations = db.Locations.ToList();

    return View(classA);
}

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(ClassA classA)
{
    if (ModelState.IsValid)
    {
        db.Entry(classA).State = EntityState.Modified;

        foreach (var member in classA.Resources)
        {
            member.Location = db.Locations.SingleOrDefault(l => l.Id == member.Location.Id);
            db.Entry(member).State = (member.Id == 0) ? EntityState.Added : EntityState.Modified;
        }

        db.SaveChanges();
        return RedirectToAction("Index");
    }
    return View(classA);
}

Когда я редактирую запись ClassA, она сохраняет соответствующие Поле «Роль» ресурса изменяется в форме, но не «Местоположение».

Если у кого-то есть какие-либо идеи, пожалуйста, дайте мне знать.

Кроме того, я думал о создании ViewModel, объявив его следующим образом: publi c class ClassAViewModel: ClassA, а затем используя AutoMapper для сопоставления всех атрибутов, поскольку у меня так много на «реальном» ClassA. Есть мысли об этом подходе?

Я ценю вашу помощь. - Ред.

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