我刚开始使用实体框架,正在尝试插入数据库
但我遇到了一个问题,因为我只需要保存来自其他3个作用域的对象的更改
像这样:
这是我将对象添加到实体中的三个操作:
public void AddEndereco(entidade_endereco entEndereco)
{
db.entidade_endereco.Add(entEndereco);
}
public void addContato(entidade_contato entContato)
{
db.entidade_contato.Add(entContato);
}
public void addBanco(entidade_banco entBanco)
{
db.entidade_banco.Add(entBanco);
}
在这个操作中,我需要将所有对象插入我的DB:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(entidade entidade, string Grupo, string Situacao)
{
if (ModelState.IsValid)
{
if (Grupo != "")
entidade.gre_codigo = Convert.ToInt32(Grupo);
if (Situacao != "")
entidade.sie_codigo = Convert.ToInt32(Situacao);
if (entidade.ver_ativo)
entidade.ent_ativo = "S";
else
entidade.ent_ativo = "N";
if (entidade.ver_cliente)
entidade.ent_cliente = "S";
else
entidade.ent_cliente = "N";
if (entidade.ver_fornecedor)
entidade.ent_fornecedor = "S";
else
entidade.ent_fornecedor = "N";
//ADDING ANOTHER OBJECT
db.entidades.Add(entidade);
//HERE IS WHERE I NEED TO SAVE ALL (entidade_endereco, entidade_contato, entidade_banco, entidade)
db.SaveChanges();
return RedirectToAction("Index");
}
return View(entidade);
}
但它只是保存了entidade
对象,其他对象在执行db.SaveChanges()
时已不存在。
如何将在其他作用域中添加到我的实体中的对象插入到DB中
如果你真的想让它按原样运行,你需要在请求之间存储上下文(真的坏主意)或实体(稍微坏一点)。会话状态跃然纸上,但使用它会带来一大堆新的痛苦。
理想情况下,您应该更改设计以利用HTTP的无状态特性。每个操作方法都应该是一个单独的事务,在方法完成时保存执行过程中的数据。如果这些单独的实体只有在它们都保存在一起时才有意义,那么您需要在一个操作中创建所有实体,并将它们一起保存到上下文中。管理不同业务实体的边界以及保存这些边界是应用程序设计的关键部分,我强烈建议您阅读有关领域驱动开发中的聚合根的内容。即使你没有走完整的DDD路线,聚合根的概念也会对你非常有帮助。微软的CQRS之旅提供了这些概念(以及许多其他概念)的深入教程
我不确定我是否答对了你的问题(对不起,我的西班牙语不好)。在Action Create中,您只将"entidade"添加到entidades集合中,因此它是唯一受SaveChanges()影响的集合。如果您想添加其他人,请包括在创建操作中或尝试进行EF事务。
在没有事务的情况下,创建方法结束后上下文将丢失