2012-07-30 94 views
1

现在我有三个控制器。随机(父母),菜单&姓名(子女)。继承父控制器中断父控制器

我有RandomController中的几个方法在数据库上工作,但我想要Menu & Name来指定不同的数据库。但是,如果我从Random中删除数据库上下文声明,则会引发各种错误。

作为一个侧面说明,随机将永远不会对自己的访问,它的存在只是为了用于菜单&名称提供代码

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

    } 
} 

回答

1

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

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

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

    ... 

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

    ... 
} 
1

保留在父控制器作为protected构件分贝上下文,然后通过适当的上下文到使用DI每个子控制器的构造。或者,如果你不想使用依赖注入,你可以只是初始化子构造函数内的上下文。

+0

或作为构造函数参数或抽象属性。 – SLaks 2012-07-30 00:55:23

+0

这对于使用连击背景(如父母)菜单控制工作正常,但是当我到达名称控制器,并开始在构造函数中使用NamesContext,我得到: 错误最佳重载的方法匹配“Controllers.RandomController.RandomController(Models.CombosContext)”有一些无效参数 错误参数1:无法从“Models.NameContext”转换为“Models.CombosContext” – 2012-07-30 01:12:41

+1

您需要使用常见的两种接口成员类型的上下文。 – 2012-07-30 01:16:57