0
votes

I am new to Entity Framework 4.0, using it with C#, and currently experimenting with its features.

What I noticed is that, like with most similar ORMs, it relies on an Context object to deal with the data-manipulation and CRUD statements generation done on the generated entities.

This means that if I want to save the changes back to the database, I always need to be able to have access to a reference to the ObjectContext that has instanciated the entities.

It is fine and all if the context has been created in an accessable scope (same method, for example), but what if I pass an entity or and entity set to a method and want this method to save the changes? It looks like the only easy way is to pass the ObjectContext along with the parameters.

Another solution would be placing the ObjectContext in some sort of global variable. Needless to say, I find styling and maintainability issues to both of these approaches.

In short, the best way I can imagine is getting a reference to the ObjectContext from the entity or entity set. I know that it isn't possible by default.

I have found a method showing adding an extension method to get the ObjectContext from the entity. However, it only works for entities with relationships and calling this method is expensive according to the author.

I was thinking about maybe modifying the T4 template to add a Context property to all my entities and fill it automatically on entities' instanciation.

I have already modified T4 template once to have Entity Framework enforce Max Length on my generated classes (by following Julie Lerman's Programming Entity Framework 4 book). I can't say I really enjoy the T4 syntax so far, but if that's the best/only way, so be it...

Has anyone already done so and what would be the best way to handle this and willing to share his T4 template or explain what are the best partial methods or events to hook into to get this done?

Is there any major downside in using such an approach? I am thinking that having so many references to the ObjectContext may hinder/delay its ability to be recollected by the GC if some of my entities remain in scope but I actually have no use anymore for the ObjectContext.

Many thanks.

1

1 Answers

0
votes

If you need to pass object context as parameter together with your entities you are doing something wrong.

Usually context is needed only in well defined layer. All classes from this layer which requires context to their logic can receive the context through some specialized class - context provider (it can also be called service locator). Context provider will hold current context instance in some storage - you can create your own or you can store it per thread, per http request, etc.

If they need more then one context instance in your classes you can modify your provider to work also as factory.

Another common approach is combined with dependency injection. You will pass the context to your classes through the constructor (or property) and you will have some bootstraper code which will do all necessary initialization for you (create required instances and pass all dependencies into them). Again you can pass a context or a factory. This is usually used together with IoC containers which will do the plumbing for you.

Once you have this infrastructure prepared you can pass your entity to the any initialized class from that layer and it will have the context available.