Использование Entity Framework 4.0 с Code-First и POCO: как получить родительский объект со всеми его дочерними элементами? - PullRequest
2 голосов
/ 02 марта 2010

Я новичок в EF 4.0, так что, возможно, это простой вопрос. У меня есть VS2010 RC и последний EF CTP. Я пытаюсь реализовать пример кода "Foreign Keys" в блоге разработчиков EF Team, http://blogs.msdn.com/efdesign/archive/2009/10/12/code-only-further-enhancements.aspx.

public class Customer
{
   public int Id { get; set; 
   public string CustomerDescription { get; set; 
   public IList<PurchaseOrder> PurchaseOrders { get; set; }
}

public class PurchaseOrder
{
   public int Id { get; set; }
   public int CustomerId { get; set; }
   public Customer Customer { get; set; }
   public DateTime DateReceived { get; set; }
}

public class MyContext : ObjectContext
{
   public RepositoryContext(EntityConnection connection) : base(connection){}
   public IObjectSet<Customer> Customers { get {return base.CreateObjectSet<Customer>();} }
}

Я использую ContextBuilder для настройки MyContext:

{
   var builder = new ContextBuilder<MyContext>();

   var customerConfig = _builder.Entity<Customer>();
   customerConfig.Property(c => c.Id).IsIdentity();

   var poConfig = _builder.Entity<PurchaseOrder>();
   poConfig.Property(po => po.Id).IsIdentity();

   poConfig.Relationship(po => po.Customer)
      .FromProperty(c => c.PurchaseOrders)
      .HasConstraint((po, c) => po.CustomerId == c.Id);

   ...
}

Это работает правильно, когда я добавляю новых клиентов, но не пытаюсь получить существующих клиентов. Этот код успешно сохраняет нового Клиента и все его дочерние Закупки:

using (var context = builder.Create(connection))
{
   context.Customers.AddObject(customer);
   context.SaveChanges();
}

Но этот код извлекает только объекты Customer; их списки BuyOrders всегда пусты.

   using (var context = _builder.Create(_conn))
   {
      var customers = context.Customers.ToList();
   }

Что еще мне нужно сделать с ContextBuilder, чтобы MyContext всегда получал все PurchaseOrders с каждым клиентом?

Ответы [ 3 ]

3 голосов
/ 25 мая 2010

Вы также можете использовать:

var customers = context.Customers.Include("PurchaseOrders").ToList();

Или включите LazyLoading в ContextOptions:

context.ContextOptions.LazyLoadingEnabled = true;

Просто будьте осторожны с отложенной загрузкой, если вы сериализуете объекты или у вас могут возникнуть проблемы со всей базой данных.

2 голосов
/ 04 марта 2010

Что ж, решение оказалось простым, как я и предполагал. Я вызвал метод context.LoadProperty () для каждого отдельного клиента:

using (var context = _builder.Create(_conn))
{
    var customers = context.Customers.ToList();
    foreach (var customer in customers)
    {
        context.LoadProperty<Customer>(customer, c => c.PurchaseOrders);
    }
    return customers;
}
1 голос
/ 01 мая 2010

Я работаю с выпущенной версией 4.0 / VS 2010 / EF и не могу найти пространство имен, в котором хранится ContextBuilder. В примерах CTP, которые я видел, это в Microsoft.Data.Objects, но я не могу найти эту ссылку. У меня не было проблем при создании примера Model-First, но я застрял на примере Code-First, с которым я работаю ... любая помощь очень ценится!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...