2013-03-23 82 views
2

對於我第一次使用EF代碼的程序。在過去,我使用LINK to SQL和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 class DeliveryData 
{ 
    [Key] 
    public int DeliveryId { get; set; } 
    public virtual Record Record { get; set; } 

    ....lots of public properties 

現在當我嘗試使用延遲加載時,使用下面的鱈魚,遞送類的所有屬性都爲null E:

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

在你的Context構造函數中添加這些行:'Configuration.LazyLoadingEnabled = true; Configuration.ProxyCreationEnabled = true;' – 2013-03-24 12:02:43

+0

嘗試過但沒有任何成功解決我的問題。 – 2013-03-24 12:11:49

回答

4

必須從Record構造去掉導航引用的初始化,空導航的初始化收集是OK:

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

從本質上講,這些線「覆蓋」的裝載值數據ShippingDataDeliveryData的構造函數設置,可能是默認值0null

關於您的評論的附註「。包括(x => x .......)未顯示我的導航」。您需要在代碼文件的開頭放置using System.Data.Entity;以使Include擴展方法可用,並將lambda表達式作爲參數。

0

當你的調試停在那裏,你應該得到一個交付代理類。如果你沒有得到這個,你應該在你的上下文中啓用延遲加載。你可以檢查here如何啓用延遲加載。

如果您不想啓用延遲加載,則應在查詢中使用Include來包含Delivery信息。 Here你可以有一些信息如何使用包括。

+0

我想要延遲加載,但在使用codefirst時應默認啓用延遲加載。延遲加載似乎工作,因爲我得到一個實例交付,只有沒有字段從數據庫加載。 – 2013-03-23 20:03:27