EF-код сначала подключает и создает прокси

#c# #ef-code-first #entity-framework-4.1

#c# #ef-код-первый #entity-framework-4.1

Вопрос:

Допустим, у меня есть объект Foo.

 public class Foo
{
  public int Id {get;set;}
  public virtual ICollection<Bar> Bars {get;set;}
}
  

Когда я получаю этот объект из базы данных, я фактически получаю прокси, и все работает так, как должно быть.

Но могу ли я присоединить Foo к DbContext и создать прокси вручную, чтобы Bars возвращал не null после его присоединения, а фактическую коллекцию bars?

Значение

 var foo = new Foo { Id = 1 };
Context.Set<Foo>().Attach(foo);
foo = CreateProxyOf(foo);
var countOfBars = foo.Bars.Count();
  

Есть ли что-то вроде CreateProxyOf?

Ответ №1:

Да, есть способ, но вместо конструктора Foo вы должны использовать:

 var set = Context.Set<Foo>();
var foo = set.Create();
foo.Id = 1;
set.Attach(foo);
var countOfBars = foo.Bars.Count();
  

Комментарии:

1. ДА! это то, что я искал

Ответ №2:

Когда вы получите все Foo или один Foo, вы можете сказать EF, чтобы он получал столбцы одновременно. Например:

 var foos = db.Foos.Include("Bars");

var foo = db.Foos.Include("Bars").Single(f => f.Id == 1);
  

Более подробная информация о MSDN здесь

http://msdn.microsoft.com/en-us/library/bb896272.aspx

Комментарии:

1. что я на самом деле улучшил, так это то, что если я создам var foo = new Foo{ Id = 1}. Затем возможно ли присоединить его к DbContext, чтобы столбцы были не нулевыми, а фактическим набором результатов.

2. Include возвращает объект DbQuery<>, для которого, похоже, нет метода Find. Это класс DbSet<>, который имеет функцию Find. Я что-то упускаю. Есть ли метод расширения Find и в DbQuery?

3. Вы правы — в DbQuery нет метода Find() — просто обновил код, чтобы отразить это.