2013-03-23 4 views
2

Для программы я впервые использую EF-код. Раньше я использовал linq для SQL en EF DbFirst. При возврате основной записи «Я не могу загрузить субректоры, используя навигационные свойства. Я получаю пустой субрекорд, когда все поля записи равны 0 или null.Entity Framework Code Первые навигационные свойства, возвращающие нулевые поля

Когда я хочу применить интенсивную загрузку. .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 class DeliveryData 
{ 
    [Key] 
    public int DeliveryId { get; set; } 
    public virtual Record Record { get; set; } 

    ....lots of public properties 

теперь, когда я пытаюсь использовать ленивую загрузку, все мои свойства класса доставки равны нулю, используя следующую треску е:

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(); 
     } 

на строках с ** мой отладчик говорит мне, что доставка существует, но все его свойства равны нулю.

При желании применить включаемые в следует за .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(); 

Что я делаю неправильно, или какую часть есть я misuderstood ??

+0

в вашем конструкторе контекста добавьте следующие строки: 'Configuration.LazyLoadingEnabled = true; Configuration.ProxyCreationEnabled = true; ' –

+0

Пробовал, но без каких-либо успехов в моей проблеме. –

ответ

4

Вы должны удалить инициализацию ссылки навигации из Record конструктора, инициализация пустой навигации коллекции ОК:

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

По существу эти линии «перезаписывать» загруженные данные со значениями что конструкторы ShippingData и DeliveryData установлены, вероятно, значения по умолчанию 0 и null.

Боковое примечание о вашем замечании «. Включение (x => x .......) не показывает мои навигационные данные». Вы должны положить using System.Data.Entity; в начало вашего файла кода, чтобы сделать доступным метод расширения Include, который принимает выражение лямбда как параметр.

0

Когда ваш отладочный стоп там, вы должны получить класс прокси для доставки. если вы не получаете этого, вы должны включить ленивую нагрузку на свой контекст. Вы можете проверить here, как включить ленивую загрузку.

Если вы не хотите включать ленивую загрузку, вы должны использовать Include в своем запросе, чтобы включить информацию о доставке. Here у вас может быть информация о том, как использовать include.

+0

Мне нужна ленивая загрузка, но при использовании codefirst по умолчанию должна быть включена ленивая загрузка. Похоже, что потерянная загрузка работает, потому что я получаю экземпляр без доставки, только поля не загружаются из базы данных. –

Смежные вопросы