44,000원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part8: Entity Framework Core
DB와 연결이 되지 않아 질문 남겨요
먼저AppDbContext.csusing System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; namespace MMO_EFCore { // EF Core 작동 스텝 // 1) DB Context 만들 때 // 2) DbSet<T>을 찾는다 // 3) 모델링 class 분석해서, 칼럼을 찾는다. // 4) 모델링 class에서 참조하는 다른 class가 있으면, 걔도 분석한다. // 5) OnModelCreating 함수 호출 (추가 설정 = override) // 6) 데이터 베이스의 전체 모델링 구조를 내부 메모리에 들고 있음 public class AppDbContext : DbContext { // DbSet<Item> -> EF Core한테 알려준다 // Item이라는 DB 테이블이 있는데, 세부적인 칼럼/키 정보는 item 클래스를 참고해 public DbSet<Item> Items { get; set; } // DB ConnectionString // 어떤 DB를 어떻게 연결해라 (각종 설정, Authorization 등) public const string ConnectionString = @"Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=EFCoreDb;Integrated Security=True;Connect Timeout=30;Encrypt=False;Trust Server Certificate=False;Application Intent=ReadWrite;Multi Subnet Failover=False"; protected override void OnConfiguring(DbContextOptionsBuilder options) { options.UseSqlServer(ConnectionString); } } } DataModel.csusing System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace MMO_EFCore { public class Item { // PK public int ItemId { get; set; } public int TemplateId { get; set; } // 101 -> 집행검 public DateTime CreateDate { get; set; } // 다른 클래스 참조 -> FK (Navigational Property) public int OwnerId { get; set; } public Player Owner { get; set; } } // 클래스 이름 = 테이블 이름 = Player public class Player { // 이름Id = PK public int PlayerId { get; set; } public string Name { get; set; } } } Program.csusing Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Storage; namespace MMO_EFCore { internal class Program { // 초기화 시간 좀 걸림 static void InitializeDB(bool forceReset = false) { using (AppDbContext db = new AppDbContext()) { if (forceReset && (db.GetService<IDatabaseCreator>() as RelationalDatabaseCreator).Exists()) return; db.Database.EnsureDeleted(); db.Database.EnsureCreated(); Console.WriteLine("DB Initialized"); } } static void Main(string[] args) { InitializeDB(forceReset: true); } } } SQL Server연결 문자열Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=EFCoreDb;Integrated Security=True;Connect Timeout=30;Encrypt=False;Trust Server Certificate=False;Application Intent=ReadWrite;Multi Subnet Failover=False 이렇게 되어있는 상태이고실행시 DB Initialized 출력을 못하고 계속 끝나버리길래디버그로 확인을 해보니if (forceReset && (db.GetService<IDatabaseCreator>() as RelationalDatabaseCreator).Exists()) return;이 부분에서 if 문에서 걸려서 return 됩니다 --> https://stackoverflow.com/questions/33911316/entity-framework-core-how-to-check-if-database-exists이 사이트와https://learn.microsoft.com/en-us/ef/core/managing-schemas/ensure-created이 사이트를 참조 했는데 해결을 못해서 질문 남겨봅니다.(Microsoft.EntityFrameworkCore.SqlServer 버전 8.0.3)
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part8: Entity Framework Core
EF_Core_Power_Tools 설치 오류
다운로드 받고 실행하자마자 설치 실패뜨는데 왜그런걸까요..
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part8: Entity Framework Core
C#으로 DB를 만든다음에 어떻게 외부에서 사용하나요??
이런식으로 데이터를 만들고 EC2 컴퓨터에다가 이 데이터를 옮기거나 하는 방법이 있나요?제 생각은 만든 파일을 메세지나 S3에 끌어다 넣고 올리는줄 알았는데상위 폴더를 열어서 파일을 가져갈까 생각해 봤는데 열수가 없다고 해요SQL Server 폴더에 들어가려고 해도 경로를 주지를 않아서만약에 이 데이터를 만든 걸 다른 곳에서 사용하고 싶을 때는 어떻게 해요 하나요? ㅜㅜ
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part8: Entity Framework Core
git tool
영상의 초반부에 나왔던 git버전 관리 툴이 무엇인지 알려주실수있나요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part8: Entity Framework Core
아이템만 추가로 생성하고 싶은데 문제가 있습니다.
안녕하세요, 강의 잘 듣고 있습니다!5분쯤에 나오는 내용을 보면플레이어, 아이템을 동시에 생성하는 걸로 이해가 되거든요제가 하고자 한건 이후에 아이템만 추가로 생성하고 싶었는데,Owner 부분에서 처리를 어떻게 해야하는지.. 오류가 나서 문의드립니다.db에서 보면 Rookiss는 1, Faker는 2로 OwerId 컬럼에 저장된걸 보고 Owner = 1 or 2 이런식으로 입력하니 오류가 나더라구요..기존에 생성되어있는 플레이어 정보를 참조하는 방법이 궁금합니다. 감사합니다
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part8: Entity Framework Core
sql server 개체 탐색기가 보이지 않습니다
안녕하세요 SqlServer까지 다 설치하고 껏다켰는데도 view에 SQL Server object explorer가 생기지 않는 이유가 무엇일까요..
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part8: Entity Framework Core
17:33 Guild Update1vM시 질문입니다.
Guild guild = db.Guilds .Include(g => g.Members) .Single(g => g.GuildID = id); //.... guild.Members = new List<Player>(){ new Player() { Name = "Rookiss"} }; 위의 명령을 그대로 실행시켰는데 갑자기 DELETE관련 에러가 발생해서 보니 Player를 생성은 하는데 기존 Player테이블의 모든 데이터도 삭제가 되는 것 같습니다. 에러가 발생한 것은 모든 Player의 데이터를 삭제하려니 Item이 FK로 참조하고 있기 때문에 .ThenInclude(p => p.Item)또한 포함시켜야하는 것이었구요. 실제로 ThenInclude를 추가해서 실행해보니 에러 없이 잘 작동되고, Player테이블을 확인해보니 모든 Player가 삭제되었습니다. 이게 EFCore가 업데이트 되면서 정책이 바뀐건지, 아니면 제가 어디서 실수를 한건지 모르겠습니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part8: Entity Framework Core
ChangeTracker에서 발생한 에러입니다
Guild가 Nullable이 아니어서 TestUpdateAttach의 첫번빼, StateTest Player Entity를 생성하고 SaveChanges를 하는데 에러가 발생했습니다. 원인은 Guild와의 FK와 INSERT간 충돌 발생인데, Player의 DataModel에서 Guild를 Nullable로 수정하니 적용됬습니다. 세월이 지나면서 EF Core도 발전을 해서 그런지 Nullable로 선언해두지않으면 FK 충돌 에러가 발생하는 경우가 많이 있네요... 좀 더 일찍 배울걸 그랬습니다
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part8: Entity Framework Core
GetAverageReviewScore의 Data Annotation, FluentAPI, 사용 시 질문입니다.
UDF가 Configuration(Data Annotation)과 DB Setup(FluentAPI)로 적용되는 것 까진 이해했는데 어떻게 CalcAverage의 foreach조건문에서 Program.GetAverageReviewScore를 호출했는데 C#함수가 아닌 command로 실행됬는지 모르겠습니다. 1. CalcAverage함수에서 어떻게 UDF를 찾아서 Query를 실행시킨건지 2. Data Annotation, FluentAPI로 DB에 등록된 함수들 중 command의 함수 이름과 같은 것을 찾는 것인지 궁금합니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part8: Entity Framework Core
Table Splitting에서 발생하는 에러 - EventItem is Mapped on "Item"
2022-05-10 기준 Item Entity Class에 Data Annotation으로 Item이라는 테이블에 생성하게 설정했는데, FluentAPI에서 다시 builder.Entity<Item>().ToTable("Items") 실행 시 EventItem이 이미 Item테이블에 있다고 에러가 발생한다. Item EntityClass의 Table DataAnnotation을 Items로 변경하고, FluentAPI를 추가로 사용하지 않으면 에러가 발생하지 않고 적용된다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part8: Entity Framework Core
Fluent API로 FK를 설정할 때 발생하는 에러
2022.05.06 기준 builder.Entity<Player>() .HasMany(p => p.CreatedItems) .WithOne(i => i.Creator) .HasForeignKey(i => i.CreatorID) 강사님은 영상에서 Item DataModel의 int CreatorID만 Nullable로 설정하셔서 잘되었지만 똑같이 해보면 FK에서 에러가 발생합니다. public Player Creator Property도 똑같이 Nullable로 설정해줘야 에러가 사라집니다. 원인을 잘 모르겠습니다....
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part8: Entity Framework Core
[마이그레이션 질문] 테이블 데이터 백업
| PlayerId | Name | 1 "1" 2 "2" 3 "3" 이렇게 두 개의 컬럼이 존재하는 테이블을 마이그레이션 해두고("m-1"이라 하겠습니다) 아래와 같이 GuildId 컬럼 추가 후 데이터 적용한 상태를 마이그레이션("m-2"라 하겠습니다) 했습니다. | PlayerId | Name | GuildId | 1 "1" 1 2 "2" 1 3 "3" 1 이후, m-2(최신) > m-1 > m-2 와 같은 순서로 마이그레이션을 적용할 경우, 마지막 m-2에서GuildId 컬럼의 데이터 값이 기본값인 0으로 세팅되는데, | PlayerId | Name | GuildId | 1 "1" 0 2 "2" 0 3 "3" 0 m-2(최신) > m-1 변경 시 기존 m-2 상태의 테이블 데이터를 백업하고 예제와 같이 컬럼이 없었던 때의 마이그레이션을 적용한 후 다시 돌아왔을 때 기존 데이터가 유지되는 기능은 없을까요? | PlayerId | Name | GuildId | (m-2) 1 "1" 1 2 "2" 1 3 "3" 1 | | PlayerId | Name | (m-1) 1 "1" 2 "2" 3 "3" | | PlayerId | Name | GuildId | (m-2) 1 "1" 1 2 "2" 1 3 "3" 1
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part8: Entity Framework Core
SELECT 후에 디비 업데이트 질문이 있습니다
SelectLoading 이나 DTO 형태처럼 일부 데이터만 가져온 뒤에 업데이트하는 방법은 없는건가요? Select 할때 모든 데이터를 가져오는게 아니라 특정 컬럼만 가져와서 업데이트 하는 경우입니다
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part8: Entity Framework Core
게임 기획과 연결해 생각하기
안녕하세요. 게임기획을 배울때 전투시스템이라는 것이 있다고 들었는데 이것은 그냥 클래스내의 메소드(함수)를 어떻게 만들까의 내용일까요. 아니면 여기나오는것처럼 데이타 테이블로 만들게 되나요? 제가 기획에서 시스템이라는 것들과 여기서 배운 코딩이 정리가 잘 안되서 도움 요청드립니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part8: Entity Framework Core
강의 내용 중복 문의
안녕하세요, 항상 강의 잘 듣고 있습니다. 아래 분께서 남겨주신 대로 내용이 반복되고 있는데요, 중복된 내용이 들어간 자리에(8:25~) 원래 있어야 할 내용이 빠졌다거나 한 내용은 없을까요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part8: Entity Framework Core
Unhandled exception
안녕하세요. 강사님. 강의 잘 듣고 있습니다. 'CRUD 실습' 을 진행하는 과정에서 에러가 났는데, 구글신에 검색해봐도 딱히 해결법을 찾지 못해 글 남깁니다. 올려주신 코드 확인해봐도 똑같고, forceReset 이 true 면 Db 새로 잘 만드는데 forceReset 을 false 로 하고 실행하면 스샷과 같이 Exception 이 납니다. 이유가 무엇일까요..
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part8: Entity Framework Core
영상 8:24분에 내용이 중복됩니다.
영상 8:24분에 지나갔던 내용이 다시 나오고 있습니다. 수정 부탁드립니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part8: Entity Framework Core
InitalizeDB시 에러 문제..
강의대로 DB를 생성하려는 순간 ------------------------------ db.Database.EnsureDeleted(); db.Database.EnsureCreated(); 해당 부분에서 아래의 에러가 발생됩니다. ㅠ System.InvalidOperationException: 'A relational store has been configured without specifying either the DbConnection or connection string to use.' 어떻게 해결해야 하는지요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part8: Entity Framework Core
콘솔앱(.NET Core)가 보이지 않아요.
처음에 콘솔앱 (.NET Core)를 새 프로젝트로 만들려고 찾아보았지만 보이질 않아요 visual installer 에서 따로 무엇을 다운 받아야 하나요? 아님 구글에서 검색해서 앞서 말한 앱을 따로 받아야 하나요? 구글에서도 검색해보니까 속시원하게 대답해주는 것도 없는거 같아서... 질문 올립니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part8: Entity Framework Core
EntityState.Unchanged로 처리 후 데이터베이스 조회시 다른 필드값이 null인 경우에 대한 질문
안녕하세요? Rookiss님. 몬스터가 드랍하는 아이템중에 stackable 아이템이 있어서 DB 조회없이 바로 갯수를 업데이트하고자 하여 아래와 같이 코드를 작성했습니다. 그 후에 다시 인벤토리 아이템을 클라에 통보하기 위하여 조회를 했으나 Stackable Item의 다른 Property가 모두 NULL이 되어 버리네요. 그래서 결국 아이템을 조회한 후에 갯수를 추가하니 정상적으로 처리가 되네요. 질문1 : 이런 경우 entityState를 사용하지 못하고 꼭 데이터베이스에 조회를 해야할 까요? 질문2 : stackable Item의 경우라면 어떤 로직으로 처리를 하는 게 바람직할 지 조언을 부탁드리고자 합니다. ------------------------------------------------------------------------------------ 구글링을 통해 stackoverflow에서 찾아본 결과는 아래와 같습니다. stackoverflow의 답변 https://stackoverflow.com/questions/28479933/after-setting-entitystate-unchanged-the-entity-properties-are-lost => 채택된 답변은 아이템의 갯수를 업데이트하기 전에 먼저 조회를 하라고 합니다. ------------------------------------------------------------------------------------ 제가 작성중인 Dbtransaction 클래스의 메서드입니다. ------------------------------------------------------------------------------------ public static void RewardStackableItem(Player player, GameRoom room, int itemDbId, int totalCount) { if (player == null || room == null || itemDbId == 0) return; ItemDb oldItemDb = new ItemDb() { ItemDbId = itemDbId, Count = totalCount }; // YOU Instance.Push(() => { S_UpdateItem updateItemPacket = new S_UpdateItem(); using (AppDbContext db = new AppDbContext()) { // 방법1. EntityState 로 처리 //db.Entry(oldItemDb).State = EntityState.Unchanged; //db.Entry(oldItemDb).Property(nameof(ItemDb.Count)).IsModified = true; // 방법2 : 데이터베이스에 조회를 한 후에 처리 ItemDb item = db.Items .Single(i => i.OwnerDbId == player.PlayerDbId && i.ItemDbId == itemDbId); item.Count = totalCount; bool success = db.SaveChangesEx(); if (success) { //문제가 발생하는 부분으로 인벤토리의 해당 아이템을 수정하지 않고 그냥 조회 후 인벤토리를 clear한 후에 다시 인벤토리의 아이템을 만들어서 클라에 통보하고자 하였습니다. List<ItemDb> items = db.Items .Where(i => i.OwnerDbId == player.PlayerDbId).ToList(); player.Inven.Items.Clear(); // Me room.Push(() => { foreach (ItemDb itemDb in items) { Item item = Item.MakeItem(itemDb); if (item != null) { player.Inven.Add(item); ItemInfo info = new ItemInfo(); info.MergeFrom(item.Info); updateItemPacket.Items.Add(info); } } player.Session.Send(updateItemPacket); }); } } }); }