当创建/更新相关模型asp.net EF6时,一个到零或一个关系错误

本文关键字:一个 错误 关系 更新 创建 模型 EF6 net asp | 更新日期: 2023-09-27 17:51:15

我需要映射两个具有1到0或一个关系的实体。当我创建一个主要对象时,它会工作。

我有以下模型:

//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();行触发的。当我试图添加一个新的Resultado模型。但是,当我为已经在DB中有相关对象的主体实例调用Create操作时,它会按预期重新创建对象,重写DB上的值。

在Resultado控制器的创建视图中,我必须更新Sugerencia模型的一个属性。

存储更新、插入或删除语句影响了意外的行数(0)。实体可能已经被修改或删除,因为实体被加载

注意我正在插入或修改实例。我正在通过命令窗口调试并在该行设置一个断点。当输出resultado和sugerencia变量时,所有属性似乎都有效。

谢谢你考虑我的问题。

当创建/更新相关模型asp.net EF6时,一个到零或一个关系错误

看看你的代码,这是我认为正在发生的事情:

// 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();

首先,在Create操作中何时需要将resultado状态设置为EntityState.Modified ?此外,我猜您的模型配置将Resultado.ID设置为外键,因此当您之前设置resultado.Sugerencia = sugerencia时,Resultado.ID被设置为不等于零的值。

你应该可以用

db.Entry(resultado).State = EntityState.Added;
相关文章: