0

vs2015에 돌아 왔습니다. 데이터베이스를 작성/수정하고 ef 디자이너와 함께 업데이트하기 위해 외부 프로그램을 사용했습니다. vs2017에서 일부 타사 도구와 함께 디자이너를 사용할 수도 있지만 먼저 코드로 전환하고 싶습니다. 이 컨텍스트에서 .net 표준 클래스 라이브러리를 전환하고 싶습니다.EntityFrameworkCore 및 다중 탐색을 포함한 Sqlite 코드 첫 번째 코드

하지만 데이터베이스를 작동시키는 데 어려움이 있습니다. 다음은 예입니다. edmx 파일을 열 때 표시되는 내용입니다.

DesignerLayout

아이디

는 그것이 외부 서비스에 의해 제공되고, 증가되지 않는다. 서비스의 모든 사용자는 고유 한 ID를 갖고 거기에 저장합니다. 지금


그리고 내 (아주 간단) 코드 첫 번째 모델 :

public class Users { 
     public int UserID { get; set; } 
     public string Name { get; set; } 

     public Currency Currency { get; set; } 
     public TimeWatched TimeWatched { get; set; } 
    } 

    public class Currency { 
     public int UserID { get; set; } 
     public int CurrencyValue { get; set; } 

     public Users Users { get; set; } 
    } 

    public class TimeWatched { 
     public int UserID { get; set; } 
     public long Time { get; set; } 

     public Users Users { get; set; } 
    } 

내 DbContext는 다음과 같습니다

 using Microsoft.Data.Sqlite; 
    using Microsoft.EntityFrameworkCore; 

    public class context : DbContext { 

    public DbSet<Users> Users { get; set; } 
    public DbSet<Currency> Currency { get; set; } 
    public DbSet<TimeWatched> TimeWatched { get; set; } 

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { 
     var connectionStringBuilder = new SqliteConnectionStringBuilder { DataSource = "test.db" }; 
     var connectionString = connectionStringBuilder.ToString(); 
     var connection = new SqliteConnection(connectionString); 

     optionsBuilder.UseSqlite(connection); 
    } 

    protected override void OnModelCreating(ModelBuilder modelBuilder) { 
     base.OnModelCreating(modelBuilder); 

     modelBuilder.Entity<Users>() 
      .HasKey(c => c.UserID); 

     modelBuilder.Entity<Users>() 
      .Property(c => c.UserID) 
      .ValueGeneratedNever(); 

     modelBuilder.Entity<Users>() 
      .HasOne(a => a.Currency) 
      .WithOne(b => b.Users) 
      .HasForeignKey<Currency>(b => b.UserID); 

     modelBuilder.Entity<Users>() 
      .HasOne(a => a.TimeWatched) 
      .WithOne(b => b.Users) 
      .HasForeignKey<TimeWatched>(b => b.UserID); 

     modelBuilder.Entity<Currency>() 
      .HasKey(k => k.UserID); 

     modelBuilder.Entity<TimeWatched>() 
      .HasKey(k => k.UserID); 
    } 
} 

그것은이 같은 테스트 :

  using(var context = new testStandard.context()) { 

      context.Database.EnsureCreated(); 

      var user = new Users { 
       Name = "test", 
       TwitchUser = 123456, 
       Currency = new Currency { 
        TwitchUser = 123456, 
        CurrencyValue = 999 
       }, 
       TimeWatched = new TimeWatched { 
        TwitchUser = 123456, 
        Time = 500 
       } 
      }; 

      context.Users.Add(user); 

      context.SaveChanges(); 
     } 

     using(var context = new context()) { 
      var user = context.Users.First(); 
      // Currency and TimeWatched are always null 
     } 

나는 통화와 시세가 항상 null 인 이유를 모른다. 무엇이 잘못 되었나요?

+1

언제 통화와 시간이 얼마입니까? EF Core가하지 않는 것들 중 하나는 (너무 많은 사람들이 잘못했기 때문에) 탐색 속성을 자동으로 수화하는 것입니다 (또는 게으른로드). 이것은 종종 잘못 사용되어 커다란 비효율적 인 SQL이 생성되기 때문입니다. 자세한 내용은이 기사를 참조하십시오. https://docs.microsoft.com/en-us/ef/core/querying/related-data –

답변

0

감사합니다. Jamie! 솔루션을 찾았습니다 :