现在我有三个控制器。随机(父母),菜单&姓名(孩子们)。
我在RandomController中有几个可以在数据库上工作的方法,但是我想要Menu&名称以指定不同的数据库。但是,如果我从Random中删除数据库上下文声明,则会抛出各种错误。
作为旁注,Random将永远不会自行访问,它仅用于为Menu&提供代码。名称
整个控制器并不是必需的,但这里有一些我必须提出想法的方法。所有的db。将ComboContext声明移动到子项时,语句会中断。
public class RandomController : Controller
{
publicCombosContext db = new CombosContext();
//
// GET: /Home/
public ActionResult Index()
{
var rows = db.Combos.OrderBy(a => a.Id).ToArray();
int arrLength = rows.Length;
Random ran = new Random();
Combo newCombo = new Combo
{
MainPrefix = rows[ran.Next(0, arrLength)].MainPrefix,
MainDescriptor = rows[ran.Next(0, arrLength)].MainDescriptor,
MainDish = rows[ran.Next(0, arrLength)].MainDish,
Connector = rows[ran.Next(0, arrLength)].Connector,
SecondaryDescriptor = rows[ran.Next(0, arrLength)].SecondaryDescriptor,
SecondaryDish = rows[ran.Next(0, arrLength)].SecondaryDish
};
return View(newCombo);
}
public ActionResult Create()
{
return View(new Combo());
}
[HttpPost]
public ActionResult Create(Combo model)
{
db.Combos.Add(model);
db.SaveChanges();
return RedirectToAction("Create");
}
public ActionResult Edit(int id)
{
Combo editMe = db.Combos.Find(id);
return View(editMe);
}
[HttpPost]
public ActionResult Edit(Combo editMe)
{
if (ModelState.IsValid)
{
db.Entry(editMe).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
else
{
return View(editMe);
}
}
}
答案 0 :(得分:1)
将父上层控制器中的db上下文保留为protected
成员,然后使用DI将适当的上下文传递给每个子控制器的构造函数。
public class RandomController : Controller
{
protected readonly CombosContext db;
protected RandomController (CombosContext db)
{
this.db = db;
}
...
}
public class MenuController : RandomController
{
public MenuController (CombosContext db)
: base (db)
{
}
}
或者,如果您不想使用依赖注入,则可以初始化子构造函数内的上下文。
答案 1 :(得分:1)
另一种方法是向父控制器添加一个抽象属性,其中类型是由您需要使用的上下文实现的接口。
public RandomController : Controller
{
...
protected abstract IContext Db { get; }
...
}
public MenuController : RandomController
{
private SomeContext db = new SomeContext();
...
protected override IContext Db { get { return db; } }
...
}