MVC 3 EF - Добавление новой записи с использованием существующих данных - PullRequest
1 голос
/ 23 марта 2012

У меня есть БД с двумя таблицами счетов-фактур и клиентов.Клиенты ПК - это FK в таблице счетов.У меня есть представление Создать, в котором пользователь заполняет данные счета.В этой форме у меня есть @ Html.DropDownList с SelectList, заполненный именами уже существующих в клиентах db.На основе выбора пользователя поля данных клиента автоматически заполняются данными клиента из базы данных через частичное представление:

@using (Ajax.BeginForm("CustomerSelect", "Invoice", new AjaxOptions{
            HttpMethod = "GET",
            InsertionMode = InsertionMode.Replace,
            UpdateTargetId = "CustomerFields"}))

Это работает хорошо, но когда я создаю кнопку «Отправить», она создает новый экземпляр пользователя.в базе данных, хотя он должен использовать идентификатор одного из полученных из базы данных.Когда частичное представление отображается в представлении «Создать», оно отображает правильный идентификатор клиента:

<div class="editor-label">
    @Html.LabelFor(model => model.Customer)

    <div class="editor-field">
        @Html.EditorFor(model => model.Customer)
        @Html.ValidationMessageFor(model => model.Customer)
    </div>
</div>

Но когда я заглядываю внутрь объекта счета в методе httppost контроллера Create, он показывает другой (новый) идентификатор клиента:

[HttpPost]
public ActionResult Create(Invoice invoice)
{
    if (ModelState.IsValid)
    {
        db.Invoices.Add(invoice); **//invoice.Customer.CustomerID == 1**
        db.SaveChanges(); **//invoice.Customer.CustomerID changes to next free in the db == 7**
        return RedirectToAction("Index");
    }

   return View(invoice);
}

Что я делаю не так?

1 Ответ

3 голосов
/ 23 марта 2012

Метод Add добавляет все сущности в графе сущностей.Поэтому, если для вашего экземпляра счета установлено свойство Customer и вы вызываете Добавить, он создает новые записи как для клиента, так и для счета.

Если вы хотите добавить только счет, у вас есть несколько вариантов:

  • Выставлять CustomerID в накладной и не работать со свойством навигации.Это предложит вам связь с внешним ключом , которую гораздо проще использовать в этом сценарии.
  • Измените состояние экземпляра клиента обратно на неизменное, чтобы были только счет и связь между счетом и клиентом.считается добавленным.

Пример:

db.Invoices.Add(invoice); 
db.Entry(invoice.Customer).State = EntityState.Unchanged;
db.SaveChanges(); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...