- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
안녕하세요.
자바개발자인데 5월부터 시작하는 .Net Core 프로젝트때문에 공부좀 할려고 강의를 듣게되었습니다.
하지만 .Net Core는 처음이고 .Net Core에대한 지식조차 하나도 없는데...
DB관련에서 어려움이 생기더군요.
혹시나 같은 어려움을 겪으시는 분이 있으시다면 참조하세요.
●윈도우 사용자분들은
섹션 4. 엔티티 프레임워크 코어의 DbContext 강의에서 아래 명령어 실행후 하시고
① ...MyApp> dotnet tool install --global dotnet-ef
② ..MyApp> dotnet add package Microsoft.EntityFrameworkCore.Design
③ ..MyApp> dotnet ef <- 이젠 강의와 같은 정보가 출력된 것을 볼 수가 있습니다.
아래 MyAppContext.cs 내용이 있으니 참조하세요. MyAppContext설정하나가 추가됨
섹션 6. ASP.NET Core Identity 의 환경설정에서
DbContext에서 IdentityDbContext<ApplicationUser>로 변경하면 IdentityDbContext가 임포드할 수가 없다.
프로젝트폴더(MyApp) 우클릭 > [프로젝트 파일 편집] 클릭
MyApp.proj:다른건 디폴트로 건들리지 말아 주시고 PostgreSQL 라이브러리만 추가
<ItemGroup>
⓪<!-- dotnet add package Microsoft.EntityFrameworkCore.Design 인스톨후 자동추가됨 -->
⓪<!-- http://www.npgsql.org/efcore/index.html -->
⓪<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="5.0.5">
⓪⓪<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> ⓪<PrivateAssets>all</PrivateAssets>
⓪</PackageReference>
<!-- 추가 -->
④<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="3.0.0" />
</ItemGroup>
① ~ ④까지만 하시면 .Net Core 3.1로 하셔도 문제없으리라 봅니다.
● 환경
맥 OS 카탈리나
.Net Core 3.1 현재 3.1만 다운로드? 2.0은 어디있는 것인지 모르겠슴.
.Net 5.0
Visual Studio mac
Docker
PostgreSQL 11.5
● wwwroot는 직접생성
● Controllers 폴더에 HomeController.cs 생성하기.
추가 -> 새 파일 -> ASP .Net Core -> 컨트롤러 클래스 -> 파일명 : HomeController
● Model 작성
추가 -> 새 파일 -> General -> 빈 클래스 -> 파일명 : Student or 추가 -> 새 클래스 -> General -> 빈 클래스 -> 파일명 : Student
● Razor 뷰 파일 생성.(Index.cshtml)
추가 -> 새 파일 -> ASP .Net Core -> Razor 뷰[cshtml] -> 파일명 : Index(Index -> Student
● Startup.cs : MVC 패턴에 매핑을위한 세팅
/* .Net Core 2.1
app.UseMvc(routes =>
{
⓪routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}");
}); */
// ASP.NET Core 3.1
app.UseEndpoints(endpoints =>
{
⓪endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}");
});
% dotnet ef <- EF Core 3.0부터 dotnet ef 컨맨드가 .NET SDK에 포함되어 있지 않다합니다.
● 터미널에서 열기
1.[프로젝트(MyApp)] 우클릭 > [도구] > [Open in Terminai Window]
2. 또는 [프로젝트(MyApp)] 우클릭 > [도구] > [터미널에서 열기]
● % dotnet ef <- 없데요.
Could not execute because the specified command or file was not found.
Possible reasons for this include: *You misspelled a built -in dotnet command.
*You intended to execute a.NET program, but dotnet - ef does not exist.
*You intended to run a global tool, but a dotnet - prefixed executable with this name could not be found on the PATH.
1이나 2의 [터미널에서 열기]해서 아래와 같이 인스톨 또는 업데이트해준다.
처음이면 인스톨.
● % dotnet tool install --global dotnet-ef 없으면 인스톨
% dotnet tool update --global dotnet-ef 버젼이 낮으면 업데이트(3.0.0이상으로.)
● % dotnet add package Microsoft.EntityFrameworkCore.Design <- 이것도 설치해야함.
● % dotnet ef <- 이젠 강의와 같은 정보가 출력된 것을 볼 수가 있습니다.
● view > sql server object explorer <- visual studio mac 에는 설치가 안되는 듯.
Docker에 리눅스 이미지가 있다하는데, 저는 이 번 프로젝트가 Oracle에서 PostgreSQL로 마이그레이션이라 PostgreSQL로.
PostgreSQL은 Docker에 설치하셔도 되고, 직접 로컬에 설치하셔도 됩나다.
● Docker를 설치하고 MyApp/docker-compose.yml 생성
● appsetting(마이그레이션을 위해 appsetting생성)
추가 -> 새 파일 -> ASP .Net Core -> 앱 설정 파일(App Settings File) > 파일명 : appsettings 디폴트
Docker의 DB실행 MyApp 디렉토리로 이동. VS mac 터미널로 여시길.
● % docker-compose up -d
-d는 백그라운드로 실행(도커의 PostgreSQL 시작)
● % docker-compose down
백그라운드 종료(PostgreSQL 종료).
도커 어플리케이션에서 종료해도 됨.
여기까지 진행하시면 강의 따라가실 수 있으십니다.
현재 섹션 5. Repository 패턴까지는 문제없네요.
### 생성된 파일 첨부
● MyApp/appsettings.json <- 생성
추가 -> 새 파일 -> ASP .Net Core -> 앱 설정 파일(App Settings File) > 파일명 : appsettings 디폴트
{
⓪"Logging": {
⓪⓪"LogLevel": {
⓪⓪⓪"Default": "Warning"
⓪⓪}
⓪},
⓪"AllowedHosts": "*", <- 콤마부터 추가
⓪"ConnectionStrings": {
⓪⓪"MyAppContext": "Host=localhost;Database=MyApp;Port=15432;Username=cstest;Password=cstest"
⓪}
}
● MyApp/docker-compose.yml <- 생성
version: '3'
volumes:
⓪postgres_data:
⓪⓪driver: 'local'
services:
⓪postgres:
⓪⓪build:
⓪⓪⓪context: ./postgres
⓪⓪⓪dockerfile: Dockerfile
⓪⓪container_name: "postgres1152" # Docker 컨테이너명
⓪⓪environment:
⓪⓪⓪POSTGRES_PASSWORD: postgres # 수퍼유저 패스워드
⓪⓪⓪POSTGRES_USER: cstest # 추가할 DB유저ID
⓪⓪⓪POSTGRES_PASSWORD: cstest # DB유저패스
⓪⓪⓪POSTGRES_DB: MyApp # DB명
⓪⓪⓪TZ: "Asia/Tokyo"
⓪⓪ports: - 15432:5432 # Docker:Docker내부의 PostgreSQL port
⓪⓪volumes:
⓪⓪⓪- postgres_data:/var/lib/postgresql/data
⓪⓪⓪- ./postgres/sql:/docker-entrypoint-initdb.d
● MyApp/postgres/Dockerfile <- 생성
FROM postgres:11.5-alpine <- 버젼은 원하는 버젼으로.
● MyApp/Startup.cs
public void ConfigureServices(IServiceCollection services) {
services.AddDbContext<MyAppContext>(options =>
{
⓪// PostgreSQL
⓪options.UseNpgsql(_config.GetConnectionString("MyAppContext"));
});
● 프로젝트폴더(MyApp) 우클릭 > [프로젝트 파일 편집] 클릭
MyApp.proj:다른건 디폴트로 건들리지 말아 주시고 PostgreSQL 라이브러리만 추가
<ItemGroup>
⓪<!-- dotnet add package Microsoft.EntityFrameworkCore.Design 인스톨후 자동추가됨 -->
⓪<!-- http://www.npgsql.org/efcore/index.html -->
⓪<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="5.0.5">
⓪⓪<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> ⓪<PrivateAssets>all</PrivateAssets>
⓪</PackageReference>
⓪<!-- PostgreSQL 라이브러리 추가입력 -->
⓪<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="5.0.5.1" />
</ItemGroup>
● MyAppContext.cs
생성자의 매개변수 DbContextOptions에 MyAppContext추가
public class MyAppContext : DbContext
{
⓪public MyAppContext(DbContextOptions<MyAppContext > options) : base(options){}
⓪public DbSet<Student> Students { get; set; }
⓪public DbSet<Teacher> Teachers { get; set; }
}
추가기입
섹션 6. ASP.NET Core Identity 의 환경설정에서
DbContext에서 IdentityDbContext<ApplicationUser>로 변경하면 IdentityDbContext가 임포드할 수가 없네요.
● 프로젝트폴더(MyApp) 우클릭 > [프로젝트 파일 편집] 클릭
MyApp.proj:다른건 디폴트로 건들리지 말아 주시고 Identity 라이브러리만 추가
<ItemGroup>
⓪<!-- dotnet add package Microsoft.EntityFrameworkCore.Design 인스톨후 자동추가됨 -->
⓪<!-- http://www.npgsql.org/efcore/index.html -->
⓪<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="5.0.5">
⓪⓪<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> ⓪<PrivateAssets>all</PrivateAssets>
⓪</PackageReference>
⓪<!-- PostgreSQL 라이브러리 추가입력 -->
⓪<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="5.0.5.1" />
<!-- 추가 -->
<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="3.0.0" />
</ItemGroup>