2

プログラムの場合、初めてEFコードを最初に使用しています。過去に、私は linq to SQL en EF DbFirst を使用していました。メイン レコードを取得するときに、ナビゲーション プロパティを使用してサブレコードを読み込めません。すべてのレコード フィールドが 0 または null の空のサブレコードを取得します。

熱心な読み込みを適用したい場合。.Include(x=>x.......) にナビゲーションが表示されません。

次のクラスを設定しました。

public Record()
    {
        Shipping = new ShippingData();
        Delivery = new DeliveryData();
        Items = new List<Item>();
        ImportDate = DateTime.Now;
    }

    [Key]
    public int RecordId { get; set; }
    public int ShippingId { get; set; }
    public int DeliveryId { get; set; }
    public DateTime ImportDate { get; set; }

    public virtual ShippingData Shipping { get; set; }
    public virtual DeliveryData Delivery { get; set; }
    public virtual List<Item> Items { get; set; }
    public virtual Collecting CollectingOrder { get; set; }

次のコンテキストで:

public class TweemansContext : DbContext
{
    public TweemansContext()
        : base("xxxx")
    {
    }

    public DbSet<Add.Record> Records { get; set; }
    public DbSet<Add.ShippingData> Shipping { get; set; }
    public DbSet<Add.DeliveryData> Delivery { get; set; }
    public DbSet<Add.Item> ProductItems { get; set; }
    public DbSet<Add.Kolli> Kolli { get; set; }
    public DbSet<Add.Collecting> CollectingOrders { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<Record>().HasRequired(s => s.Shipping)
                    .WithMany()
                    .HasForeignKey(s => s.ShippingId);
        modelBuilder.Entity<Record>().HasRequired(d => d.Delivery)
                    .WithMany()
                    .HasForeignKey(d => d.DeliveryId);
        modelBuilder.Entity<Record>().HasOptional(c => c.CollectingOrder)
                    .WithOptionalDependent(a => a.Record).Map(p => p.MapKey("CollectionID"));
    }
}

配信クラスは、次のように public クラスです。

    public class DeliveryData
{
    [Key]
    public int DeliveryId { get; set; }
    public virtual Record Record { get; set; }

    ....lots of public properties

遅延読み込みを使用しようとすると、次のコードを使用して配信クラスのすべてのプロパティが null になります。

using (TweemansContext context = new TweemansContext())
        {
            var imported = (from record in context.Records
                            where record.ImportDate.Year == date.Year && record.ImportDate.Month == date.Month && record.ImportDate.Day == date.Day
                            select record).ToList();

            foreach (var Record in imported)
            {
                string email;
                string telnr;
                CustomerService service = new CustomerService(connectionString);
                **string servicenr = Record.Delivery.AccountNumber.Substring(2, 8);**
                service.GetUserData(servicenr, out email, out telnr);
                Record.Delivery.Email = email;
                Record.Delivery.TelephoneNbr = telnr;
            }
            context.SaveChanges();
        }

** の行では、デバッガーは配信が存在することを通知していますが、そのプロパティはすべて null です。

次のようにインクルードを適用したい場合、.include にナビゲーションが表示されません:

    var imported = (from record in context.Records.Include(x=>x.)
                            where 
                               record.ImportDate.Year == date.Year 
                               && record.ImportDate.Month == date.Month
                               && record.ImportDate.Day == date.Day
                            select record).ToList();

私は何を間違っていますか、またはどの部分を誤解しましたか??

4

2 に答える 2

4

コンストラクターからナビゲーション参照の初期化を削除する必要がありますRecord。空のナビゲーションコレクションの初期化は問題ありません。

Shipping = new ShippingData(); // remove this line
Delivery = new DeliveryData(); // remove this line

ShippingData基本的に、これらの行は、ロードされたデータをおよびのコンストラクターがDeliveryData設定した値、おそらくデフォルト値0および で「上書き」しますnull

「 .Include(x=>x.......) は私のナビゲーションを表示していません」という発言についての補足事項。ラムダ式をパラメーターとして受け取る拡張メソッドを使用できるusing System.Data.Entity;ようにするには、コード ファイルの先頭に配置する必要があります。Include

于 2013-03-24T12:35:37.130 に答える
0

デバッグがそこで停止すると、Delivery でプロキシ クラスを取得する必要があります。これを取得できない場合は、コンテキストで遅延ロードを有効にする必要があります。ここで、遅延ロードを有効にする方法を確認できます。

遅延読み込みを有効にしたくない場合は、クエリに Include を使用して配信情報を含める必要があります。ここでは、インクルードの使用方法に関する情報を得ることができます。

于 2013-03-23T19:55:11.197 に答える