1

I have wrote my app using EF 6.1.2 via code first. After entering the command "Update Database" the database was created in my Microsoft SQL Server 2017. So far so good. However I never saw in my app.config (from the class library) the connection string to my database. It is just not there, but, surprisingly for me it works. It connects to my local server flawlessly.

Now, I have moved my data base to the cloud, therefore I have a connection string. I have copy-pasted my connection string into the app config, but it still points to the initial Server.

My app.config looks like this:

 <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <configSections>
        <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
       <!--For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468--> 
      </configSections>
      <entityFramework>
        <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
        <providers>
          <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
        </providers>
      </entityFramework>
    </configuration>

I tried putting the connection string but it takes no effect. It still points to the local server. I have even deleted everything, and pasted my connection string but no success.

    Any ideas of how to add my connection string so that it will point to the database from the cloud?

    **UPDATE**:
The web.config as Roman requested. I have put the connection string there but it makes no difference (yes I am am aware of the 'X'-s, I don't wanna share the database :-) ):

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>

  <connectionStrings>
    <add name="freeaspconnection" connectionString="Server=XXXX;Database=XXXXXX;uid=liviusosu;pwd=;" providerName="System.Data.SqlClient" />
  </connectionStrings>

  <appSettings>
    <add key="webpages:Version" value="3.0.0.0" />
    <add key="webpages:Enabled" value="false" />
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
    <add key="NumberOfUserTasksPerPage" value="7" />
    <add key="NumberOfArticlesPerPage" value="10" />
    <add key="NumberOfCoursesPerPage" value="10" />
    <add key="NumberOfJobAnnouncementsPerPage" value="30" />
    <add key="NumberOfInterviewQuestionsPerPage" value="30" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5" maxRequestLength="1048576" />
    <authentication mode="Forms">
      <forms loginUrl="User/LogIn" timeout="300" />
    </authentication>
  </system.web>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Newtonsoft.Json" culture="neutral" publicKeyToken="30ad4fe6b2a6aeed" />
        <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Optimization" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="1.1.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="0.0.0.0-1.5.2.14234" newVersion="1.5.2.14234" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="0.0.0.0-5.2.3.0" newVersion="5.2.3.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
  <system.codedom>
    <compilers>
      <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701" />
      <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+" />
    </compilers>
  </system.codedom>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>

</configuration>

And here is the DBContext

public class CareerTrackContext : DbContext
{
    public CareerTrackContext()
        : base("CareerTrack")
    {

    }

    public DbSet<User> Users { get; set; }
    public DbSet<Article> Articles { get; set; }
    public DbSet<UserTask> UserTasks { get; set; }
    public DbSet<Role> Roles { get; set; }
    public DbSet<Company> Companies { get; set; }
    public DbSet<Course> Courses { get; set; }
    public DbSet<Book> Books { get; set; }
    public DbSet<Review> Reviews { get; set; }
    public DbSet<Location> Locations { get; set; }
    public DbSet<JobAnnouncement> JobAnnouncements { get; set; }
    public DbSet<Skill> Skills { get; set; }
    public DbSet<InterviewQuestion> InterviewQuestions { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
        modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();

        modelBuilder.Properties()
            .Where(p => p.Name == p.ReflectedType.Name + "Id")
            .Configure(p => p.IsKey());

        modelBuilder.Properties<string>()
            .Configure(p => p.HasColumnType("varchar"));

        modelBuilder.Properties<string>()
            .Configure(p => p.HasMaxLength(1000));

        modelBuilder.Entity<JobAnnouncement>()
           .HasMany(c => c.Skills).WithMany(i => i.JobAnnouncements)
           .Map(t => t.MapLeftKey("JobAnnouncementId")
               .MapRightKey("SkillId")
               .ToTable("JobAddsSkills"));

        modelBuilder.Configurations.Add(new UserConfiguration());
        modelBuilder.Configurations.Add(new ArticleConfiguration());
        modelBuilder.Configurations.Add(new UserTaskConfiguration());
        modelBuilder.Configurations.Add(new RoleConfiguration());
        modelBuilder.Configurations.Add(new CompanyConfiguration());
        modelBuilder.Configurations.Add(new CourseConfiguration());
        modelBuilder.Configurations.Add(new BookConfiguration());
        modelBuilder.Configurations.Add(new ReviewConfiguration());
        modelBuilder.Configurations.Add(new LocationConfiguration());
        modelBuilder.Configurations.Add(new JobAnnouncementConfiguration());
        modelBuilder.Configurations.Add(new SkillConfiguration());
        modelBuilder.Configurations.Add(new IntreviewQuestionConfiguration());

        base.OnModelCreating(modelBuilder);
    }

    public override int SaveChanges()
    {
        foreach (var entry in ChangeTracker.Entries().Where(entry => entry.Entity.GetType().GetProperty("DateRegistered") != null))
        {
            if (entry.State == EntityState.Added)
            {
                entry.Property("DateRegistered").CurrentValue = DateTime.Now;
            }

            if (entry.State == EntityState.Modified)
            {
                entry.Property("DateRegistered").IsModified = false;
            }
        }

        foreach (var entry in ChangeTracker.Entries().Where(entry => entry.Entity.GetType().GetProperty("DateAdded") != null))
        {
            if (entry.State == EntityState.Added)
            {
                entry.Property("DateAdded").CurrentValue = DateTime.Now;
            }

            if (entry.State == EntityState.Modified)
            {
                entry.Property("DateAdded").IsModified = false;
            }
        }

        foreach (var entry in ChangeTracker.Entries().Where(entry => entry.Entity.GetType().GetProperty("IsActive") != null))
        {
            if (entry.State == EntityState.Added)
            {
                entry.Property("IsActive").CurrentValue = true;
            }
        }

        foreach (var entry in ChangeTracker.Entries().Where(entry => entry.Entity.GetType().GetProperty("IsRead") != null))
        {
            if (entry.State == EntityState.Added)
            {
                entry.Property("IsRead").CurrentValue = false;
            }
        }

        foreach (var entry in ChangeTracker.Entries().Where(entry => entry.Entity.GetType().GetProperty("Status") != null))
        {
            if (entry.State == EntityState.Added)
            {
                entry.Property("Status").CurrentValue = "New";
            }
        }
        return base.SaveChanges();
    }
}
Liviu Sosu
  • 1,381
  • 3
  • 15
  • 26
  • Possible duplicate of [Pass connection string to code-first DbContext](https://stackoverflow.com/q/4805094/102937) – Robert Harvey Nov 03 '17 at 15:43
  • What is the type of your application? Connection string is taken from the config file of the runnable project. So if it's a web app then connection string is taken from the web.config, not app.config – Roman Koliada Nov 03 '17 at 15:45
  • @RobertHarvey, no it is not. I just cannot find the connection string. It must be somewhere. :-) – Liviu Sosu Nov 03 '17 at 15:46
  • @RomanKoliada It is a class library. Indeed I use the methods there in a web app, but no worries, I have modified the web.config as well. still no success. – Liviu Sosu Nov 03 '17 at 15:47
  • 1
    I don't see a connection string in the XML you've posted. – Robert Harvey Nov 03 '17 at 15:49
  • Could you show the web.config and DbContext files? – Roman Koliada Nov 03 '17 at 15:49
  • @RobertHarvey , the connection string is now on the web.config that I have shared in this post. It was initially on the app.config, but since it did not take any effect I have removed it. – Liviu Sosu Nov 03 '17 at 16:08
  • @RomanKoliada, Thanks for trying to help. I have shared the web.config and the dbcontext. If that gets you an idea please let me know. What it is really strange is that I never had an connection string anywhere, but it worked. I was connecting to the local database with no issues. I am still connected with it whatever I do. – Liviu Sosu Nov 03 '17 at 16:11
  • 1
    You db connection string should be names as `CareerTrack`. Did you try to search across the solution? – Roman Koliada Nov 03 '17 at 16:13
  • @RomanKoliada nope, I haven't. But the answer down bellow was exactly what I need it. Thanks for trying to help anyway! – Liviu Sosu Nov 07 '17 at 10:57

1 Answers1

2

Entity Framework will work without connection strings, although I would prefer to have control to avoid situations like this and to do web.config transforms.

If you provide nothing in your context constructor you will get a SQL Express database (.\SqlExpress instance) if SQL express is installed locally. Otherwise you get a localDb in either your user profile folder or the \App_Data folder. Database is named after context I believe.

If you provide a name in your constructor, it will look for a connection string by that name, but if it can't find one it follows the above rule but assigns the constructor value as the name of the database. This is your current situation.

So in short (too late), to solve your issue change your context constructor to the name of your connection string.

public CareerTrackContext()
    : base("freeaspconnection")
{

}

For info on how EF connects see here.

Steve Greene
  • 12,029
  • 1
  • 33
  • 54
  • Man, you saved me. It was not too late, I've just updated the constructor and the config files. Thank you so much! – Liviu Sosu Nov 07 '17 at 10:54