Skip to content Skip to sidebar Skip to footer

Database-first Approach In Entity Framework Without Auto Generated Code

I wonder, if there is any way , to use Database-first approach with manually generated classes (models) in advance(just like Code-first approach), but without using auto-generated

Solution 1:

As I suspected, the problem is not whether or not you can have a database and a class model independently. Of course you can! All these generation tools and migration stuff only serve one goal: making life easier, help you keeping both models in sync. But you can do that job yourself just as well. The end result is always: two models that – at runtime – don't interact with each other whatsoever. (Don't interact? No, not as such. There must be a middleman, an ORM, to connect both worlds.)

The reason why you don't get data is because lazy loading does not occur. Your statement is

var listOfGrades = _context.Students.Where(s => s.Name.StartsWith("J"))
                   .FirstOrDefault().StudentToCourses;

This requires lazy loading, because the FirstOrDefault() statement executes the first part of the query. It renders a Student of which subsequently the StudentToCourses are accessed. But these don't load because the collection is not virtual. It should be

publicvirtual ICollection<StudentToCourse> StudentToCourses { get; set; }

This enables EF to override the collection in a dynamic proxy object that is capable of lazy loading.

But of course is is more efficient to get the collection in one statement, for example:

var listOfGrades = _context.Students.Include(s => s.StudentToCourses)
                   .Where(s => s.Name.StartsWith("J"))
                   .FirstOrDefault().StudentToCourses;

Solution 2:

Yes, you can. You just need a context with no initialization strategy (so it doesn't try to create or migrate your existing database):

publicclassExistingDatabaseContext : DbContext
{
    publicExistingDatabaseContext()
        : base("ExistingDatabaseConnectionStringName")
    {
        Database.SetInitializer<ExistingDatabaseContext>(null);
    }

    // DbSets here for your "code-first" classes that represent existing database tables
}

Just bear in mind that this context will not be capable of doing migrations or any other form of initialization, so if you have actual true code-first tables in there as well, you'll need a separate context to manage those.

Post a Comment for "Database-first Approach In Entity Framework Without Auto Generated Code"