0
vs2015에 돌아 왔습니다. 데이터베이스를 작성/수정하고 ef 디자이너와 함께 업데이트하기 위해 외부 프로그램을 사용했습니다. vs2017에서 일부 타사 도구와 함께 디자이너를 사용할 수도 있지만 먼저 코드로 전환하고 싶습니다. 이 컨텍스트에서 .net 표준 클래스 라이브러리를 전환하고 싶습니다.EntityFrameworkCore 및 다중 탐색을 포함한 Sqlite 코드 첫 번째 코드
하지만 데이터베이스를 작동시키는 데 어려움이 있습니다. 다음은 예입니다. edmx 파일을 열 때 표시되는 내용입니다.
아이디
는 그것이 외부 서비스에 의해 제공되고, 증가되지 않는다. 서비스의 모든 사용자는 고유 한 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 인 이유를 모른다. 무엇이 잘못 되었나요?
언제 통화와 시간이 얼마입니까? EF Core가하지 않는 것들 중 하나는 (너무 많은 사람들이 잘못했기 때문에) 탐색 속성을 자동으로 수화하는 것입니다 (또는 게으른로드). 이것은 종종 잘못 사용되어 커다란 비효율적 인 SQL이 생성되기 때문입니다. 자세한 내용은이 기사를 참조하십시오. https://docs.microsoft.com/en-us/ef/core/querying/related-data –