Here is a image from the ANTS memory profiler. It seens that there are a lot of objects hold in memory. How can I find what I am doing wrong?
Do you clear the ObjectContext
once in a while. If you keep an ObjectContext
alive for a long time this will consume memory related to the size of the EntityDataModel and the number of Entities loaded into this ObjectContext
.
I had the same problem in a class which uses dependency injection, so the using()
option was not an alternative. My solution was to add DbContextOptions<Context>
to the constructor and as a private field to the class. Then, you can call
_db.Dispose();
_db = new BlockExplorerContext(_dBContextOptions);
at appropriate times. This fixed my problem where I was running out of RAM and the application was killed by the OS.
Couple of things come to my mind:
using(var context = CreateObjectContext())
blockfrom customer in context.Customers select customer
instead of doing from customer in context.Customers select customer.FirstOrDefault()
I have had hard time making Entity Framework to work in an N-tier application. It's just not suitable for using in N-tier apps as is. Only EF 4.0 is. You can read about all my adventure in making EF 3 work in an N-tier app.
http://www.codeproject.com/KB/linq/ef.aspx
Does this answer your question?
I have a hunch you don't dispose the context.
I suggest disposing the context whenever you done interacting with database.
Use using
statement whenever you create the context.
[Edit]
As far as I can see, you cache and don't dispose your EFUnitOfWork
object. It is disposable, which is correct, but I don't see when disposable is called. Seems like you hold a reference to the context for all application run time.
Moreover, you create and hold one context per thread, which will make it even worse.
I can't tell you for sure where you should put Dispose
or using
, as I don't know the usages.
You could put it probably to your Commit
method, but I don't know if the Commit
called only once during database interaction session.
Also, your design might be overcomplicated.
If I were you, I would:
If I had time I would do long-term solution right away.
But again, I can't tell if the complexity of your design is justified, as I don't know how big your application is and what it does and what the requirements are.