Едно към нула или една грешка във връзката при създаване/актуализиране на свързан модел asp.net EF6

Трябва да картографирам два обекта с едно към нула или едно отношение. когато създам основен обект, той работи.

Имам следните модели:

//Principal class
public class Sugerencia     
    {
            public int ID { get; set; }
            [DisplayName("Título")]
            public string Titulo { get; set; }
    //More properties simplified for example
    }
//Related class
public class Resultado
    {
        [ScaffoldColumn(false)]
        public int SugerenciaID { get; set; }
        [ScaffoldColumn(false)]
        public int ID { get; set;}
        //More properties
    }

Това е моят клас DbContext

public class SugerenciaContext : DbContext
{
    public SugerenciaContext() : base("SugerenciaContext")
    {
    }

    public DbSet<Sugerencia> Sugerencias { get; set; }
    public DbSet<Resultado> Resultados { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Resultado>()
       .HasRequired(r => r.Sugerencia)
       .WithOptional(s => s.Resultado);
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
    }
}

Обърнете внимание на отмяната на OnModelCreate за карта на връзката.

Това са действията за създаване на ResultadoController (POST и GET)

//GET
public ActionResult Create(int? id)
    {
        ViewBag.ID = new SelectList(db.Sugerencias, "ID", "Titulo");
        if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }
        //I am retrieving the principal model instance to set resultado.Sugerencia property.
        Sugerencia sugerencia = db.Sugerencias.Find(id);
        if (sugerencia == null)
        {
            return HttpNotFound();
        }
        Resultado resultado = new Resultado();
        resultado.Sugerencia = sugerencia;
        return View(resultado);
    }

//POST
public ActionResult Create([Bind(Include = "ID,SugerenciaID,Responsable,Resultados,Fecha")] Resultado resultado, string status)
        {
            if (ModelState.IsValid)
            {
                resultado.Fecha = System.DateTime.Now;
                Sugerencia sugerencia = db.Sugerencias.Find(resultado.ID);
                if (sugerencia == null)
                {
                    return HttpNotFound();
                }
                sugerencia.Status = status;
                //Here I am modifying the state property of Sugerencia model.
                db.Entry(sugerencia).State = EntityState.Modified;
                db.Entry(resultado).State = resultado.ID == 0 ? EntityState.Added : EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index");
            }

            ViewBag.ID = new SelectList(db.Sugerencias, "ID", "Titulo", resultado.ID);
            return View(resultado);
        }

Грешката, която получавам, се задейства в db.SaveChenges();line. Когато се опитвам да добавя нов модел Resultado. Въпреки това, когато извикам действието Create за главен екземпляр, който вече има свързан обект в DB, ​​той пресъздава обекта, пренаписвайки стойностите в DB, ​​както се очаква.

В изгледа за създаване на контролера Resultado трябва да актуализирам едно свойство на модела Sugerencia.

Изявлението за актуализация, вмъкване или изтриване на магазина засегна неочакван брой редове (0). Обектите може да са били променени или изтрити след зареждането на обектите

Забележка: Вмъквам или променям екземпляра. Отстранявам грешки чрез командния прозорец и задавам точка на прекъсване на този ред. При отпечатване на променливи resultado и sugerencia всички свойства изглеждат валидни.

Благодаря, че обмислихте въпроса ми.


person alejandro zuleta    schedule 29.05.2015    source източник
comment
Идентификационният номер на външния ключ трябва да е nullable int?   -  person Ashley Medway    schedule 29.05.2015
comment
Искате да кажете да нулирате идентификатора в контролера? Не е възможно, тъй като FK не може да се нулира.   -  person alejandro zuleta    schedule 29.05.2015
comment
Трябва да НАПРАВИТЕ ключа nullable   -  person Ashley Medway    schedule 29.05.2015


Отговори (1)


Гледайки вашия код, това е, което мисля, че се случва:

// This is not needed, by the way, since the previous line should have done this
db.Entry(sugerencia).State = EntityState.Modified;

// This is probably setting resultado's state to Modified, even for new items!
db.Entry(resultado).State = resultado.ID == 0 ? EntityState.Added : EntityState.Modified;

db.SaveChanges();

Първо, кога ще трябва да зададете състоянието resultado на EntityState.Modified в действие Създаване? Освен това предполагам, че конфигурацията на вашия модел задава Resultado.ID като външен ключ, така че когато преди сте задали resultado.Sugerencia = sugerencia, Resultado.ID е зададен на стойност, различна от нула.

Би трябвало да си добре с

db.Entry(resultado).State = EntityState.Added;
person jjj    schedule 29.05.2015