EntityFramework 4, DbSet and ObjectContext

geek picture geek · Mar 22, 2012 · Viewed 7.5k times · Source

few days ago i read tutorial about GenericRepository and Unit Of Work patterns http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application. I use web forms and i have EntityFramework CTP4 package installed. (I can't using EF 5).

I want to code generic repository for my project but i was stuck at this line:

this.dbSet = context.Set<TEntity>();

I know that this line doesn't work because a use ObjectContext in my project and database first approach. How can i deal with it? Can I code generic repository without migration to code first (which is not an option in my case) ?

Answer

CodingGorilla picture CodingGorilla · Mar 22, 2012

This is the equivalent for ObjectContext:

this.dbSet = context.CreateObjectSet<TEntity>();

Now this creates an ObjectSet<TEntity> rather than a DbSet<TEntity>, but for your pattern you can use it in the same way.

UPDATE

The ObjectSet class does not have a utility method like that matches the Find() method of the DbSet. In order to "Get by key" you would need to construct an EntityKey and use the ObjectContext.GetEntityByKey(), unfortunately that's not a really simple thing to do.

There really isn't a simple way to tackle this, that I've found. In my case what I've done is to base all of my entities from a common class (using custom T4 templates to generate the classes from the model). And then I can add a generic constraint to my repositories, like:

public class MyRepository<TEntity> where TEntity : MyEntityBaseClass

And then my common base class has an Id field which is inherited by all the entities so I can can simply do:

return myObjectSet.SingleOrDefault(x => x.Id == myId);

I'm sure there are other approaches, that might be a good topic for another question.