2016-07-28 4 views
1

シンプルなマスター/ディテール関係をsqliteデータベースに書き込むことで、私はEF7の周りを見据えようとしています。保存が正常に動作します、しかし、読み込みが私に頭痛を与える:ここでEF7マスター詳細レコードを読む

は私のエンティティです:

public class Message 
{ 
    public int MessageId { get; set; } 
    public string Name { get; set; }   
    public List<MessagePart> MessageParts { get; set; } 
} 
public class MessagePart 
{ 
    public int MessagePartId { get; set; } 
    public string Text { get; set; }   
    public int MessageId { get; set; } 
    public Message Message { get; set; } 
} 

createMessage()それがすることになっているものを行います。

static void createMessages() 
    { 
     using (var db = new TestContext()) 
     { 
      var m1 = new Message 
      { 
       Name = "train_arrives_in_x_minutes",      
       MessageParts = new List<MessagePart>() 
       { 
        new MessagePart { 
         Text = "Train arrives in 5 minutes"        
        }, 
        new MessagePart { 
         Text = "Zug faehrt in 5 Minuten ein",        
        } 
       } 
      }; 
      var m2 = new Message 
      { 
       Name = "train_out_of_service", 
       MessageParts = new List<MessagePart>() 
       { 
        new MessagePart { 
         Text = "train is out of service"        
        }, 
        new MessagePart { 
         Text = "Kein Service auf dieser Strecke",        
        } 
       } 
      }; 

      db.Messages.Add(m1); 
      db.Messages.Add(m2); 

      var count = db.SaveChanges(); 
      Console.WriteLine("{0} records saved to database", count); 

     } 
    } 

は、既存のデータベースからの読み込み読み込みマスターレコードは正常ですが、詳細レコードセットポインタはnullのままです。

static void readMessages() 
    { 
     using (var db = new TestContext()) 
     { 
      foreach (Message m in db.Messages) 
      { 
       Console.WriteLine(m.Name); 
       // exception here: m.MessageParts is always null 
       foreach(MessagePart mp in m.MessageParts) 
       { 
        Console.WriteLine("mp.Text={0}", mp.Text); 
       }      
      }     
     } 
    } 

これらのメッセージを強制的に読み込むためにできることはありますか?私は前に他の(Python)ORMで作業していましたが、これまでにこの問題があったことはありません。これはレイジーローディングの問題ですか? LINQステートメントを使って子レコードを取得しようとしましたが、どちらも助けにはなりませんでした。しかし、すべてがデータベースでよく見えます。

答えて

2

あなたが遅延読み込みを有効にしたい場合は、(デフォルトで有効にする必要があります)を遅延読み込みを有効にして、あなたの財産を作成する必要があり仮想

public TestContext() 
    : base(Name = "ConntextionName") 
{ 
    this.Configuration.ProxyCreationEnabled = true; 
    this.Configuration.LazyLoadingEnabled = true; 
} 

そして、あなたのモデルは以下のようになりshuodl:

public class Message 
{ 
    public int MessageId { get; set; } 
    public string Name { get; set; }   
    public virtual ICollection<MessagePart> MessageParts { get; set; } 
} 
public class MessagePart 
{ 
    public int MessagePartId { get; set; } 
    public string Text { get; set; }   
    public int MessageId { get; set; } 
    public virtual Message Message { get; set; } 
} 

LazyLoadingを使用しない場合は、熱心な読み込みを使用して関連するエンティティを読み込むことができます。

using System.Data.Entity; 

using (var db = new TestContext()) 
{ 
    int messageId = ....; 
    Message message = db.Messages 
     .Where(m => m.MessageId == messageId) 
     .Include(m => m.MessageParts) // Eagerly load message parts 
     .FirstOrDefault(); 

    // Your message and all related message parts are now loaded and ready. 
} 

詳細については、this siteをご覧ください。

+1

ありがとう、もう少し私はグーグルであったはずです、別のものがあります:http://ef.readthedocs.io/en/latest/querying/related-data.html – zeroc8

関連する問題