1

This has been addressed in multiple other questions, but alas, I have tried all the solutions posted there with no success. I'm developing an ASP.NET MVC application, using Code-First EF. I am trying to take advantage of the scaffolding built in so that it can automatically create a Controller for me based off my Model and DbContext. However, I am getting the following error when I try to create a Controller in this way:

'Unable to retrieve metadata for Employer.' Using the same DbCompiledModel to create contexts against different types of database servers is not supported. Instead, create a separate DbCompiledModel for each type of server being used.

The code for my model, Employer, my DbContext, MyDataContext, and my web.config file follow:

//Employer.cs
public class Employer : Organization, IEmployer
{
    public virtual PhysicalAddress Address { get; set; }

    public virtual ICollection<ContactMethod> ContactMethods { get; set; }

    public int FederalTaxID { get; set; }

    public virtual Client Client { get; set; }
}

-

//MyDataContext.cs
[DbConfigurationType(typeof(MySqlEFConfiguration))]
public class MyDataContext : IdentityDbContext<ApplicationUser>
{
    public MyDataContext()
        : base("DataConnection")
    {

    }

    static MyDataContext()
    {
        Database.SetInitializer(new DataInitializer());
    }

    public DbSet<Client> Clients { get; set; }
    public DbSet<Organization> Organizations { get; set; }      // Store Employer and OrgEntity

    /// <summary>
    /// Sets up unclear relationships between entities before the models are constructued in a database. 
    /// For example, models which extend other models must have their Ids mapped (because it is an 
    /// inherited member, and so is not found by Entity Framework by default)
    /// </summary>
    /// <param name="modelBuilder">the object responsible for constructing the database from code-first</param>
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        //set up parent organization relationship
        modelBuilder.Entity<Organization>()
            .HasOptional(n => n.ParentOrganization)
            .WithMany(o => o.ChildOrganizations)
            .Map(m => m.MapKey("ParentOrganization_Id"));

        //set up the organization-employee assignment
        modelBuilder.Entity<Employee>()
            .HasOptional(a => a.OrganizationAssignment)
            .WithMany(a => a.Employees);

        //used to integrate Identity stuff into same db as Clients, etc.
        modelBuilder.Entity<IdentityUserLogin>().HasKey<string>(l => l.UserId);
        modelBuilder.Entity<IdentityRole>().HasKey<string>(r => r.Id);
        modelBuilder.Entity<IdentityUserRole>().HasKey(r => new { r.RoleId, r.UserId });
    }
}

-

<!--web.config-->
.
.
.
<connectionStrings>
<add name="DataConnection"
     providerName="Mysql.Data.MysqlClient"
     connectionString="server=localhost;user id=myid;password=mypass;persistsecurityinfo=True;database=app_db"/>
</connectionStrings>
.
.
.

From various other posts like this one , this one , and this one . I have tried many different things to get it to work. This includes commenting out my constructor for MyDbContext, changing the providerName attribute of my connection string to be "System.Data.SqlClient", changing the connection string name to be "DefaultConnection", removing my connection strings altogether, and combinations of all of these things. I make sure to rebuild between trying to add the Controller. However, after performing these different changes, I still receive the same error when I try to add a new Controller.

Generally, I can find all my questions already answered, but the answers don't seem to be working for me on this one. I think what might separate my case from the ones linked is that my DbContext is actually an instance of IdentityDbContext. I believe the constructor for IdentityDbContext just calls the base constructor for it, anyway, so I don't see how this could be much of an issue.

Any help is much appreciated. Thank you!

Community
  • 1
  • 1

1 Answers1

0

You didn't map your Employer entity to the model. That's why compiler is unable to retrieve metadata for Employer. Firstly, add DbSet as below and let me know, if does it work.

public DbSet<Client> Clients { get; set; }
public DbSet<Organization> Organizations { get; set; }
public DbSet<Employer> Employers { get; set; }
magos
  • 3,371
  • 4
  • 29
  • 54
  • 2
    Although that's a good point, it wasn't the cause of the issue. Visual Studio was refusing to let me add a Controller for `Client`, too. What ended up fixing it for me was commenting out the line: `[DbConfigurationType(typeof(MySqlEFConfiguration))]` as well as the constructor for `MyDataContext` – user1058854 Jun 04 '14 at 22:22