OOP の原則に従っている場合は、必要に応じて実行できると思います。通常、EfDb クラスの実装に必要なものをすべて宣言するインターフェイスがあります。そうすれば、コントローラーはインターフェイスとのみ通信し、EfBd クラスに直接アクセスすることはできません。以下の例を参照してください。
インターフェース
public interface IDataSource
{
    //Person Entities
    IQueryable<Person> Persons{ get; }
    void SavePerson(Person person);        
}
EfDb クラス
    //Person
    public DbSet<Person> Persons { get; set; }
    IQueryable<Person> IDataSource.Persons
    {
        get { return Persons; }
    }
    public void SavePerson(Person person)
    {
        using (var context = new EFootballDb())
        {
            if (person.PersonId == 0)
            {
                context.Persons.Add(player);
            }
            else if (person.PersonId > 0)
            {
                 var currentPerson = context.Persons
                    .Single(p => p.PersonId == person.PersonId);
                context.Entry(currentPerson ).CurrentValues.SetValues(person);                    
            }
            context.SaveChanges();
        }
    }
次に、コントローラーで、このようにインターフェイスを呼び出すだけで、おそらく以下のように作成アクションを実装します。
 public class PersonController : Controller
 {
    private readonly IDataSource _dataSource;
    public PersonController(IDataSource dataSource)
    {
        _dataSource = dataSource;
    }
    [HttpGet]
    public ActionResult Create()
    {
        return View();
    }
    [HttpPost]
    public ActionResult Create(Person model)
    {
       try
        {
            if (ModelState.IsValid)
            {                
                _dataSource.SavePerson(model);
                return RedirectToAction("Index", "Home");
            }
        }
        catch (Exception)
        {
            ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem persists, see your system administrator.");
        }
        return View(model);
    }
長いデモンストレーションで申し訳ありませんが、オブジェクト指向プログラミング (OOP) などの特定のソフトウェア設計原則に従っている限り、すべて問題ありません。すべては、実装を他のクラスからいかにうまく隠すかにかかっています。私のデモのように、コントローラ クラスは私の EfDb クラスにアクセスできません。