1

现在我有三个控制器。随机(父),菜单和名称(子)。

我在 RandomController 中有几种适用于数据库的方法,但我希望 Menu & Name 指定不同的数据库。但是,如果我从 Random 中删除数据库上下文声明,则会引发各种错误。

附带说明一下,Random 永远不会被单独访问,它的存在只是为了提供 Menu & Name 的代码

整个控制器并不是真正需要的,但这里有一些我必须给出想法的方法。所有的分贝。当我将 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);
        }

    }
}
4

2 回答 2

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)
    {
    }
}

或者,如果您不想使用依赖注入,您可以在子构造函数中初始化上下文。

于 2012-07-30T00:53:03.267 回答
1

另一种方法是向父控制器添加一个抽象属性,其中类型是由您需要使用的上下文实现的接口。

public RandomController : Controller
{
    ...
    protected abstract IContext Db { get; }
    ...
}

public MenuController : RandomController
{
    private SomeContext db = new SomeContext();

    ...

    protected override IContext Db { get { return db; } }

    ...
}
于 2012-07-30T01:20:54.490 回答