I was in a very similar place as the OP sometime ago, so I'll expand on Roberts answer with some code of how I structured my asp.net mvc app after learning about the repository pattern.
So your project is QandA
You'll have a class library project called QandA.data
, here is where you will create your edmx file and all your entity framework classes. Then you have a repository for each entity like this:
public interface IRepository<T>
{
T Save(T entity);
void Delete(T entity);
IQueryable<T> GetAll();
T GetById(int id);
}
You could then have either a factory or use Dependency Injection to get the actually repositories. So:
class QuestionRepo : IRepository<Question>
{
//call xxxEntites and get/save/delete yourentities here.
}
static class RepositoryFactory
{
public static IRepository<Question> GetQuestionRepo()
{
return new QuestionRepo();
}
}
Then down in your calling code (in your asp.net project) you have
IRepository<Question> qRepo = RepositoryFactory.GetQuestionRepo();
Question q = qRepo.GetById(1);
Now the advantage of doing the above is, your calling code has no idea how the entities are coming through, so you could create a mock repository to test your app out.
static class RepositoryFactory
{
public static IRepository<Question> GetQuestionRepo()
{
return new FakeQuestionRepo();
//create your own fake repo with some fixed fake data.
}
}
Now you're calling code does not change at all if you throw it a fake or real repository.
Also, what robert talks about in his question is a ViewModel. So you would not make a strongly typed page of type Question. So you have
class QuestionForm
{
public string Title
public string QuestionContent
}
You're page is going to be of type QuestionForm
but in your create controller, you will take the data from the question form, fill it in your Question entity and then send it off via the repository.
[HttpPost]
public ActionResult Create(QuestionForm quesfrm)
{
IRepository<Question> qRepo = RepositoryFactory.GetQuestionRepo();
Question ques = new Question {
AskedDate = DateTime.Now,
Title = quesfrm.Title,
Content = QuestionContent
}
qRepo.Save(ques);
}
Robert mentions one of the reasons why you would do this, there are a few other reasons and you can read up more on view models on SO. Also check out the code for nerddinner
You may want to see these SO questions:
Should repositories implement IQueryable<T>?
Repository pattern: One repository class for each entity?
I hope it helped.