#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 здесь
Комментарии:
1. что я на самом деле улучшил, так это то, что если я создам var foo = new Foo{ Id = 1}. Затем возможно ли присоединить его к DbContext, чтобы столбцы были не нулевыми, а фактическим набором результатов.
2. Include возвращает объект DbQuery<>, для которого, похоже, нет метода Find. Это класс DbSet<>, который имеет функцию Find. Я что-то упускаю. Есть ли метод расширения Find и в DbQuery?
3. Вы правы — в DbQuery нет метода Find() — просто обновил код, чтобы отразить это.