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

我做错了什么,或者我误解了哪一部分?

4

2 回答 2

4

您必须从构造函数中删除导航引用Record的初始化,空导航集合的初始化是可以的:

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

本质上,这些行用构造函数ShippingDataDeliveryData设置的值“覆盖”加载的数据,可能是默认值0null

关于您的评论“ .Include(x=>x.......) 没有显示我的导航”的旁注。您需要将lambda 表达式作为参数using System.Data.Entity;放在代码文件的开头,以使扩展方法可用。Include

于 2013-03-24T12:35:37.130 回答
0

当您的调试在那里停止时,您应该在 Delivery 上获得一个代理类。如果你没有得到这个,你应该在你的上下文中启用延迟加载。您可以在此处查看如何启用延迟加载。

如果您不想启用延迟加载,则应在查询中使用 Include 以包含交付信息。在这里您可以了解如何使用包含的一些信息。

于 2013-03-23T19:55:11.197 回答