2017-11-03 20 views
1

코드를 통해 EF 6.1.2를 사용하여 내 앱을 작성했습니다. "데이터베이스 업데이트"명령을 입력하면 Microsoft SQL Server 2017에서 데이터베이스가 생성되었습니다. 지금까지는 그렇게 좋았습니다. 그러나 내 app.config 클래스 라이브러리에서 내 데이터베이스에 연결 문자열을 본 적이. 그것은 단지 거기에 없지만, 놀랍게도 저에게는 효과적입니다. 그것은 내 로컬 서버에 완벽하게 연결합니다.EF 코드에서 "보이지 않는"연결 문자열을 우선 무시하는 방법은 무엇입니까?

이제 데이터베이스를 클라우드로 이동 했으므로 연결 문자열이 생겼습니다. 복사 - 연결 문자열을 app config에 붙여 넣었지만 여전히 초기 서버를 가리 킵니다.

내의 app.config는 다음과 같습니다 다음 DBContext를

<?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> 

을 그리고 여기

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(); 
    } 
} 
내가 피하기 위해 제어를하는 것을 선호하지만
+0

[코드 첫 번째 DbContext에 연결 문자열 전달] (https://stackoverflow.com/q/4805094/102937) –

+0

응용 프로그램의 종류는 무엇입니까? 연결 문자열은 실행 가능한 프로젝트의 설정 파일에서 가져옵니다. 따라서 웹 응용 프로그램 인 경우 app.config가 아닌 web.config에서 연결 문자열을 가져옵니다. –

+0

@RobertHarvey, 그렇지 않습니다. 연결 문자열을 찾을 수 없습니다. 그것은 어딘가에 있어야합니다. :-) –

답변

2

엔티티 프레임 워크는 연결 문자열없이 작동합니다 이런 상황은 web.config transforms.

컨텍스트 생성자에 아무것도 제공하지 않으면 SQL Express가 로컬로 설치된 경우 SQL Express 데이터베이스 (. \ SqlExpress 인스턴스)를 얻게됩니다. 그렇지 않으면 사용자 프로필 폴더 또는 \ App_Data 폴더에 localDb가 생깁니다. 데이터베이스는 내가 믿는 문맥을 따라 명명된다.

생성자에서 이름을 제공하면 해당 이름으로 연결 문자열을 찾지 만 찾을 수없는 경우 위의 규칙을 따르지만 생성자 값을 데이터베이스 이름으로 할당합니다. 이것이 현재 상황입니다.

짧은 (너무 늦은) 문제를 해결하기 위해 컨텍스트 생성자를 연결 문자열의 이름으로 변경하십시오.

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

} 

EF 연결 방법에 대한 정보는 here을 참조하십시오.

+0

남자, 당신은 나를 구 했어요. 너무 늦지 않았고, 나는 단지 생성자와 설정 파일을 업데이트했다. 정말 고맙습니다! –