2

C#コンソールアプリケーションで遅延読み込みをテストしています。何らかの理由で遅延読み込みが機能していません。

context.ConfigurationのプロパティLazyLoadingEnabledとプロパティを確認しました。ProxyCreationEnabledそれらは真実です。

私の財産は仮想です。

私は他の同様のSOの質問をチェックしましたが成功しませんでした。何が起こっているのかわかりません。

これは私のコードです(名前空間を表示しないように簡略化されています):

static void Main(string[] args) {

    Models.DataContext dc = new Models.DataContext();

    Console.WriteLine("Context Lazy {0}. Proxy Creation {1} ", 
                       dc.Configuration.LazyLoadingEnabled,
                       dc.Configuration.ProxyCreationEnabled);

    var grp = dc.Groups.FirstOrDefault();     
    Console.WriteLine("GroupId {1}, AttrSet is null = {0}", 
                       grp.AttrSet == null , grp.Id); 

    var grp2 = dc.Groups.Include("AttrSet").FirstOrDefault();
    Console.WriteLine("GroupId {1}, AttrSet is null = {0}", 
                              grp2.AttrSet == null, grp2.Id); 
}

class Group  {
    public System.Guid Id { get; set; }
    public string Name { get; set; }
    public virtual AttrSet AttrSet { get; set; }
 }

class AttrSet {
    public System.Guid Id { get; set; }
    public string Name { get; set; }
}

これを実行した結果は次のとおりです。

コンテキストレイジーTrue。プロキシ作成True

GroupId 186ebc8a-dec7-4302-9f84-5a575577baac、AttrSetはnull = True

GroupId 186ebc8a-dec7-4302-9f84-5a575577baac、AttrSetはnull = False

ロードされたレコードが正しくAttrSet、データベースに適切に含まれていることを確認します。

何か案は?

アップデート

誰かが実際にコードを見たい場合に備えて、非常に単純なテストプロジェクトを作成しました。

https://bitbucket.org/josea/eflazy(GIT:https://josea@bitbucket.org/josea/eflazy.git)を参照してください

4

3 に答える 3

4

プロキシの生成は発生していません。なぜ??あなたのPOCOはプライベートだからです!! EFは、それらからプロキシを派生させるためにそれらを見ることができません。POCOを公開すると、期待どおりに機能します。

public class Group
于 2013-03-27T14:42:23.567 に答える
0

2つのクラス間の1:1の関係を構成するために何かを使用していますか?ここにいるようには見えないため、EntityFrameworkがリレーションシップを読み込めなくなります。

データ注釈を使用して、FK関係を次のように定義できます。

public class AttrSet {

  public System.Guid Id { get; set; }
  public string Name { get; set; }

  [Required, ForeignKey("MyGroup")]
  public int GroupID { get; set; }

  public virtual Group MyGroup { get; set; } 
}
于 2013-03-25T20:54:41.133 に答える
0

これはあなたが望む関係をあなたに与えるはずです。AttrSetIdは、テーブル内のFK列に名前を付けたものであるため、異なる場合は変更します。

public class Group  {

         public System.Guid Id { get; set; }
         public string Name { get; set; }
         public System.Guid AttrSetId {get;set;}         

         [ForeignKey("AttrSetId")]
         public virtual AttrSet AttrSet { get; set; }
 }

編集:

次の行をAttrSetクラスに追加します。

public virtual ICollection<Group> Groups {get;set;}

この次の行をあなたのに追加OnModelCreatingしますModels.DataContext。何らかの理由でその関数をまだオーバーライドしていない場合は、次のようになります。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);
    modelBuilder.Entity<Group>().HasOptional(x => x.AttrSet).WithMany(x => x.Groups);
}

AttrSetなしでグループを保存できると思っていたのではなく、置きましHasOptionalた。HasRequiredそれが当てはまらず、FKがnull許容でない場合は、HasRequiredを使用する必要があります。

于 2013-03-25T21:10:00.647 に答える