public class Class1
{
    public Guid Class1ID { get; set; }
    public string class1string { get; set; }
    public virtual Class2 Class2 { get; set; }
}

public class Class2
{
    public Guid Class2ID { get; set; }
    public string class2string { get; set; }
}

// POST: Class1/Edit/5
    // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
    // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Edit(Guid id, [Bind("Class1ID,Class2,class1string")] Class1 class1)
    {
        if (id != class1.Class1ID)
        {
            return NotFound();
        }

        if (ModelState.IsValid)
        {
            try
            {
                _context.Update(class1);
                await _context.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!Class1Exists(class1.Class1ID))
                {
                    return NotFound();
                }
                else
                {
                    throw;
                }
            }
            return RedirectToAction("Index");
        }
        return View(class1);
    }

En lugar de que Editar cambie los datos que están en la tabla secundaria, crea una nueva fila en la tabla y cambia el GUID en la tabla principal. La tabla principal se editó correctamente.

Cualquier ayuda será apreciada.

0
Max Stanley 27 ago. 2016 a las 00:53

2 respuestas

La mejor respuesta

También he estado luchando con este problema.

Cuando hago una edición y la guardo, presiono la función public async Task Edit (Guid id, [Bind ("Class1ID, Class2, class1string")] Class1 class1) (como era de esperar) -

Todos los valores son correctos excepto class1.Class2.Class2ID que es un guid vacío {00000000-0000-0000-0000-000000000000}

Como resultado, cuando se llama SaveChangesAsync , EF crea un nuevo registro para Class2 , en lugar de actualizar el registro existente según lo previsto.

Esto se debe a que el enlace falla, no puede encontrar el valor de Class2.Class2ID .

Esto se debe a que Get no carga este valor, ya que es casi seguro que no esté en la página.

Agregue la siguiente línea al marcado de su vista (sugiera junto a input type = "hidden" asp-for = "Class1ID" )

 <input type="hidden" asp-for="Class2.Class2ID" />

Esto debería permitir que el enlace funcione.

Espero que esto ayude.

0
cm5053 4 sep. 2016 a las 16:40

En su Clase 1, agregue también la identificación de la clave externa que debe coincidir con la propiedad de la clave principal. EF sabrá su relación

public class Class1
{
    public Guid Class1ID { get; set; }
    public string class1string { get; set; }
    public Guid? Class2ID { get; set; }
    [ForeignKey("Class2ID ")]//probably not needed as names match
    public virtual Class2 Class2 { get; set; }
}

public class Class2
{
    public Guid Class2ID { get; set; }
    public string class2string { get; set; }
}

De esa manera en su actualización class1 solo necesita verificar que pasa la propiedad Class2ID correcta y no preocuparse por la propiedad del objeto de navegación Class2.

Para guardar, debe especificar que se modificó

 public async Task<IActionResult> Edit(Class1 class1)
 {
     ...
     _context.Entry(class1).State = EntityState.Modified;
     await _context.SaveChangesAsync();
1
devfric 4 sep. 2016 a las 17:48