Search code examples
c#databaseentity-frameworkedmxauto-generate

How can I generate the database from .edmx file in Entity Framework?


I have had to suddenly switch to working on Code First Entity Framework 4.1. I started off not knowing anything about this framework but in the last 8 hrs I am now much more comfortable having read blogs and articles.

This blog in particular is one of the best blogs I have seen so far on the topic but the steps given do not match with my experience. In particular, I need more focus on the 3rd and 4th steps ('Create the Model' and 'Swap to DbContext Code Generation', respectively). I am unable to generate the database from my defined EntitySet. I am getting the SQL and I can execute but I'm getting the following error:

Could not locate entry in sysdatabases for "MyBD" database . No entry found with that name. Make sure that the name is entered correctly entity framework.

If I execute the SQL again, I get the same error following the names of tables that already exist in database.

If refresh the DataConnection in Server Explorer, there are no such tables created as I defined in Entity Framework.

How can I get rid of this error and successfully generate the tables in my .edmx?

Also I am unable to find the option on right-click in Solution Explorer to "Generate Database" from selected class file that has the context class inherited from the DBContext object. I installed the Entity framework 4.1 from Microsoft, so it should appear there... How can I get the Generate Database option?


Solution

  • If you are creating the database from the model, you need to select the empty model first. Here are the other steps to create db:

    1. Select new connection
    2. Set Server name: if you installed it, just type . to select default. You can also try (local)
    3. Set new database name
    4. Copy DDL script to your SQL server management studio's query screen
    5. Run the script to create your db

    After running the script, you will have the initial table. Config file will have connection string named as container name.

    Now, when you want to switch to code generation similar to example with TT files, you can right click and add code generation. It will create partial class for the entity model and one file for dbcontext. Similar to this:

     using System;
        using System.Collections.Generic;
    
        public partial class Contact
        {
            public int Id { get; set; }
            public string Name { get; set; }
        }
    

    Context will have only one table.

     public partial class PersonModelContainer : DbContext
        {
            public PersonModelContainer()
                : base("name=PersonModelContainer")
            {
            }
    
            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                throw new UnintentionalCodeFirstException();
            }
    
            public DbSet<Contact> Contacts { get; set; }
        }
    

    You dont need TT model. You can add these files directly. You need one context class inheriting from DbContext and one partial class file for each type of entity. If you make a change to model, EF will detect that. You need to define Db initializer. For the sample demo on that webpage, you can add initializer to another method. If it is a web project, you add this init function to Global.asax->application_Start for the initial development. You have different options for initializers. I use drop and create for initial development.

     static void InitDbCheck()
            {
                Database.SetInitializer(new DropCreateDatabaseIfModelChanges<PersonModelContainer>());
                using (var db = new PersonModelContainer())
                {
                    //accessing a record will trigger to check db.
                    int recordCount = db.Contacts.Count();
                }
            }
    
            static void Main(string[] args)
            {
    
    
    
                using (var db = new PersonModelContainer())
                {
                    // Save some data
                    db.Contacts.Add(new Contact { Name = "Bob" });
                    db.Contacts.Add(new Contact { Name = "Ted" });
                    db.Contacts.Add(new Contact { Name = "Jane" });
                    db.SaveChanges();
    
                    // Use LINQ to access data
                    var people = from p in db.Contacts
                                 orderby p.Name
                                 select p;
    
                    Console.WriteLine("All People:");
                    foreach (var person in people)
                    {
                        Console.WriteLine("- {0}", person.Name);
                    }
    
                    // Change someones name
                    db.Contacts.First().Name = "Janet";
                    db.SaveChanges();
                }
            }