2016-10-28 10 views
4

単純な快適なWeb​​ APIを作成するEntity Coreの使用。私が持っている問題は、単純なcontext.Users.ToListAsync()でクエリを実行すると、データベース内のすべてのユーザーの一覧が表示されますが、1対1のリレーションシップナビゲーションプロパティ(context.Users.Include U => u.Status).ToListAsync()、私はいつも私のデータベースで唯一の最初の項目を受け取るエンティティコアクエリは、ナビゲーションプロパティを熱心に読み込んだときに1つの項目のみを返します。

ここに私のコードファーストモデルです:。。

public class User 
{   

    public int Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string FullName { get { return LastName + ", " + FirstName; } } 
    public string Email { get; set; } 
    public string Avatar { get; set; } 
    public string GUID { get; set; } 
    public string InternalId { get; set; } 

    // Foreign keys and navigation properties 
    public virtual UserStatus Status { get; set; } 
} 

public class UserStatus 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 

    // Foreign keys and navigation properties 
    public virtual List<User> Users { get; set; } 
} 

各ユーザは、ユーザのステータスを持っている必要がありますユーザーステータスは可能なステータス状態のテーブルでなければなりません。単一のステータスタイプを持つ多くのユーザがあります。

protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 

     // Users 
     modelBuilder.Entity<User>() 
      .HasAlternateKey(p => p.GUID); 

     modelBuilder.Entity<User>() 
      .HasAlternateKey(p => p.InternalId); 

     modelBuilder.Entity<User>() 
      .HasAlternateKey(p => p.Email); 

     modelBuilder.Entity<User>() 
      .Property(p => p.FirstName) 
      .HasMaxLength(40) 
      .IsRequired(); 

     modelBuilder.Entity<User>() 
      .Property(p => p.LastName) 
      .HasMaxLength(40) 
      .IsRequired(); 

     modelBuilder.Entity<User>() 
      .Property(p => p.Email) 
      .HasMaxLength(250) 
      .IsRequired(); 

     modelBuilder.Entity<User>() 
      .HasOne(p => p.Status) 
      .WithMany(s => s.Users) 
      .HasForeignKey("StatusId") 
      .OnDelete(Microsoft.EntityFrameworkCore.Metadata.DeleteBehavior.Restrict); 

     // User Status 
     modelBuilder.Entity<UserStatus>() 
      .Property(s => s.Name) 
      .HasMaxLength(40) 
      .IsRequired(); 

    } 

そして、ここで私がテストしてる単純なデータの初期化である:私のWeb API制御で

 List<UserStatus> status = new List<UserStatus>(); 

     status.Add(new UserStatus { Name = "Invited" }); 
     status.Add(new UserStatus { Name = "Registered" }); 
     status.Add(new UserStatus { Name = "Verified" }); 
     status.Add(new UserStatus { Name = "Deactivated" }); 

     foreach (UserStatus s in status) 
     { 
      context.UserStatus.Add(s); 
     } 
     context.SaveChanges(); 

     List<User> users = new List<Users>(); 

     users.Add(new User { 
      FirstName = "Jack", 
      LastName = "Test", 
      Email = "[email protected]", 
      GUID = "TEST001", 
      InternalId = "00001", 
      Status = status[0] 
     }); 
     users.Add(new User 
     { 
      FirstName = "Jane", 
      LastName = "Tester", 
      Email = "[email protected]", 
      GUID = "TEST002", 
      InternalId = "00002", 
      Status = status[1] 
     }); 

     foreach (User u in users) 
     { 
      context.Users.Add(u); 
     } 
     context.SaveChanges(); 

は、純粋にテストのために、私は次のことをやっている:

[HttpGet] 
    public async Task<IActionResult> Get() 
    { 
     var users = await context.Users 
      .ToListAsync(); 
     return new OkObjectResult(users); 
    } 

これは正常に動作します。私は私のユーザーのリストを取得します。しかし、私がこれを行う場合:

 [HttpGet] 
     public async Task<IActionResult> Get() 
     { 
      var users = await context.Users 
       .Include(u => u.Status) 
       .ToListAsync(); 
      return new OkObjectResult(users); 
     } 

私は今まで私のデータベースに非常に最初のエントリを取得します。

 [HttpGet] 
     public async Task<IActionResult> Get() 
     { 
      var users = await context.Users 
       .Include(u => u.Status) 
       .LastAsync(); 
      return new OkObjectResult(users); 
     } 

代わりに、リスト全体が、少なくともアップToListAsyncコールまで、と協力していることを私にotの意味、私は最後を得る最初のエントリの:私はこれを行う場合。

私が間違っていることを誰かに教えてもらえますか? 1対1リレーションシップが正しく設定されていませんか? ymデータの初期化?私はこれを理解することはできません。

ありがとうございました!

答えて

1

デバッグは、私が解決策を見つけるのを助けました。

Jsonシリアライザからループ参照処理エラーが発生しました。私のモデルは、もちろん、ナビゲーションプロパティーの循環参照を使用しています。私はシリアライズ時にこれらを無視して問題を解決しました。具体的に別の質問に、このソリューションを使用して:

https://stackoverflow.com/a/38382021/7087278

そのソリューションは私が必要なものであるASP.netコア、方法が記載されています。

関連する問題