1

私はコードファーストで初めてですので、私と一緒に裸にしてください。単純なプロセスを働かせようと一日中私の髪を引っ張った後、私はコミュニティに助けを求めています。ここで私のコレクション/モデルは保存後に見栄えが良いですが、エンティティを読み込むときにデータを取り戻すことはできません。私は間違って何をしていますか?

は私のモデルのための私のソースコードです:

public class User 
{ 
    public User() 
    { 
     GUID = Guid.NewGuid(); 
     Account = new Account(); 
     Location = new Location(); 
    } 

    public long UserID { get; set; } 
    public Guid GUID { get; set; } 
    public string DisplayName { get; set; } 
    public Location Location { get; set; } 
    public virtual Account Account { get; set; } 
} 

public class UserConfiguration : EntityTypeConfiguration<User> 
{ 
    public UserConfiguration() 
    { 
     HasKey(x => x.UserID); 
    } 
} 

[ComplexType] 
public class Location 
{ 
    [MaxLength(2)] 
    public string CountryCode { get; set; } 
    [MaxLength(2)] 
    public string StateCode { get; set; } 
    public string City { get; set; } 
} 

public class Account 
{ 
    public Account() 
    { 
     if (EmailAddresses == null) EmailAddresses = new Collection<EmailAddress>(); 
    } 

    [ForeignKey("User")] 
    public long AccountID { get; set; } 

    public ICollection<EmailAddress> EmailAddresses { get; set; } 

    public virtual User User { get; set; } 
} 

public class AccountConfiguration : EntityTypeConfiguration<Account> 
{ 
    public AccountConfiguration() 
    { 
     HasKey(x => x.AccountID); 
     HasMany(x => x.EmailAddresses).WithRequired(x => x.Account); 
    } 
} 

public class EmailAddress 
{ 
    [Key] 
    public string Email { get; set; } 

    public EmailTypes Type { get; set; } 

    public long AccountID { get; set; } 
    public virtual Account Account { get; set; } 
} 

public class EmailAddressConfiguration : EntityTypeConfiguration<EmailAddress> 
{ 
    public EmailAddressConfiguration() 
    { 
     HasKey(x => x.Email); 
     HasRequired(x => x.Account).WithMany(x => x.EmailAddresses).HasForeignKey(x => x.AccountID); 
    } 
} 

そして、ここでは私のエンティティクラスです:

public class MyEntities : DbContext 
{ 
    public MyEntities() 
    { 
     Database.SetInitializer<MyEntities>(new DropCreateDatabaseAlways<MyEntities>()); 
    } 

    public DbSet<User> Users { get; set; } 
    public DbSet<Account> Accounts { get; set; } 
    public DbSet<EmailAddress> EmailAddresses { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Configurations.Add(new UserConfiguration()); 
     modelBuilder.Configurations.Add(new AccountConfiguration()); 
     modelBuilder.Configurations.Add(new EmailAddressConfiguration()); 

     base.OnModelCreating(modelBuilder); 
    } 
} 

そして最後に、テストコンソールアプリケーションで実行される私のコード:

static void Main(string[] args) 
    { 
     var id = CreateUser(); 

     using (MyEntities db = new MyEntities()) 
     { 
      var a = db.Users.Find(id); 
      var b = a.Account.EmailAddresses; 
      var c = db.Accounts.Find(id); 
      var d = db.EmailAddresses.Where(x => x.Account.AccountID == id).ToList(); 
     } 

    } 

    private static long CreateUser() 
    { 
     using (MyEntities db = new MyEntities()) 
     { 
      var u = new User(); 
      u.DisplayName = "TEST"; 

      u.Location.CountryCode = "US"; 
      u.Location.StateCode = "HI"; 
      u.Location.City = "Kauai"; 

      EmailAddress e = new EmailAddress(); 
      e.Email = DateTime.UtcNow.Ticks + "@microsoft.com"; 
      e.Type = EmailTypes.Current; 

      u.Account.EmailAddresses.Add(e); 

      db.Users.Add(u); 

      var cnt = db.SaveChanges(); 
      // Here I get a return of the 4 entities saved, and my model looks correct. 

      return u.UserID; 
     } 
    } 

モデルが保存されると(CreateUser)、モデルをナビゲートでき、すべてが完璧に見えました。

データを引き出すときに問題が発生します。
私の変数:

- 電子メールにナビゲートすると、0レコードが表示されます。

b - これもコレクションに0レコードを示します。

c - 電子メールにナビゲートすると、0件のレコードが表示されます。

D - ここに私が(モデルをナビゲートすることによってではなく)電子メールアドレスを取得することができ

助けてください!

答えて

0

ナビゲーションプロパティにアクセスするためのテストコードは、遅延ロードに依存しています。しかし、あなたのAccount.EmailAddressesコレクションがvirtualとしてマークされていない:

public ICollection<EmailAddress> EmailAddresses { get; set; } 

ナビゲーションプロパティは遅延読み込みを可能にするためにvirtual(あなたUser.Account財産のような)でなければなりません。サイドノートとして

:私はUserコンストラクタから...

Account = new Account(); 

... Accountナビゲーションプロパティのインスタンス化を削除することをお勧めします。これは、トラブルのために知られているソースです:それは複合型ではなく、ナビゲーションプロパティだからLocationをインスタンス化

What would cause the Entity Framework to save an unloaded (but lazy loadable) reference over existing data?

EF 4.1 Code First: Why is EF not setting this navigation property?

は大丈夫です。

+0

ありがとうございます。 EmailAddressesコレクションにVirtualを追加しましたが、それは何も変わりませんでした。 「Account = new Account();」を削除しました。 – user1265146

+0

@ user1265146:これは、現実的な解決策が 'Account = new Account()' **や 'virtual'コレクションを削除していることを意味していますか?あなたのコードは 'virtual'なしで動作するとは想像もできません。 – Slauma

+0

いいえ、私は "Account = new Account()"を削除し、EmailAddressesにVirtualを追加しました:) – user1265146

関連する問題