0

vs2015に戻る私はデータベースを作成/変更し、efデザイナーとの間でそれを更新するために外部プログラムを使用しました。 vs2017ではサードパーティ製のツールでデザイナを使用することもできますが、まずコードに切り替える必要があります。この文脈では私のクラスライブラリを.net標準に切り替える必要があります。EntityFrameworkCoreと複数のナビゲーションを含むSqliteで最初にコード

しかし、私はデータベースを稼働させるのに困っています。 ここでは、edmxファイルを開いたときの例を示します。

DesignerLayout

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である理由はわかりません。 何が間違っていますか?

+1

どの時点で通貨と時差がヌルですか?多くの人が間違っているため、EF Coreがやっていないことの1つは、ナビゲーションプロパティの自動ハイドレーティング(またはそれがより広く知られているように、遅延ロード)です。繰り返しますが、これは頻繁に間違って使用され、かなり大きく非効率的なSQLが生成されるためです。詳細はこの記事をご覧ください:https://docs.microsoft.com/en-us/ef/core/querying/related-data –

答えて

0

ありがとうございました! 私は解決策を見つけました:

using(var context = new context()) { 
var user = context.Users 
      .Include(c => c.Currency) 
      .Include(tw => tw.TimeWatched) 
      .First(); 
} 
関連する問題