当创建/更新相关模型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变量时,所有属性似乎都有效。
谢谢你考虑我的问题。
看看你的代码,这是我认为正在发生的事情:
// 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;