父控制器的继承会中断父控制器

时间:2012-07-30 00:47:59

标签: c# asp.net-mvc-3 entity-framework inheritance

现在我有三个控制器。随机(父母),菜单&姓名(孩子们)。

我在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);
        }

    }
}

2 个答案:

答案 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; } }

    ...
}