0
vs2015に戻る私はデータベースを作成/変更し、efデザイナーとの間でそれを更新するために外部プログラムを使用しました。 vs2017ではサードパーティ製のツールでデザイナを使用することもできますが、まずコードに切り替える必要があります。この文脈では私のクラスライブラリを.net標準に切り替える必要があります。EntityFrameworkCoreと複数のナビゲーションを含むSqliteで最初にコード
しかし、私はデータベースを稼働させるのに困っています。 ここでは、edmxファイルを開いたときの例を示します。
IDがインクリメントされていない、それは、外部サービスによって提供されます。サービスのすべてのユーザーには一意のIDがあり、そこに格納します。私のDbContextはこのようになります
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; }
}
:
そして今、私の(非常に単純な)コード最初のモデル
: 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がやっていないことの1つは、ナビゲーションプロパティの自動ハイドレーティング(またはそれがより広く知られているように、遅延ロード)です。繰り返しますが、これは頻繁に間違って使用され、かなり大きく非効率的なSQLが生成されるためです。詳細はこの記事をご覧ください:https://docs.microsoft.com/en-us/ef/core/querying/related-data –