2014-12-07 2 views
0

I имеет следующую структуру:Entity Framework Load собственность ребенка

public class A{} 

public Class B:A 
{ 
    public virtual C { get; set;} 
} 

public Class C{} 

public Class Context:DbContext 
{ 
    public DbSet<A> As { get; set; } 
    public DbSet<C> Cs { get; set; } 
} 

Когда я хочу, чтобы загрузить любой объект b, свойство C этого объекта является нулевым. В базе данных столбец C имеет идентификатор в таблице для A. Другие int или string свойства могут быть загружены без проблем.

using(var ctx = new Context()) 
{ 
    B b = ctx.As.FirstOrDefault() as B; 
} 

Можно ли решить эту проблему, используя ленивую загрузку? Использование Eagerly Loading У меня есть проблема с включением свойства B, потому что у меня есть список List<A> someAs, где некоторые элементы относятся к типу B.

Я попытался максимально упростить этот пример. Просто скажите мне предоставить дополнительную информацию.

ответ

1

Если вы хотите, чтобы с нетерпением загрузить свойство подкласса, необходимо явно запрашивать подкласс:

ctx.As.OfType<B>().Include(b => b.Cs).FirstOrDefault(); 
+0

Ах идеальный. Я думаю, что это будет делать именно то, что я хочу. Я собираюсь попробовать это завтра и сказать вам, если это сработает. Один вопрос: почему ленивая загрузка не работает в этом случае? – jasdefer

+0

О, ленивая загрузка тоже должна работать, если вы нажмете 'A' на' B', но предпочтительной является загрузка с IMO. –

+0

Это работает. Большое спасибо. Я не мог заставить его работать с ленивой загрузкой. Я не хочу его использовать, но мне любопытно. Как мне отдать 'A' на' B'. Я попробовал: 'A a = ctx.As.FirstOrDefault();', а затем 'B b = (B) a', но это не сработало. – jasdefer

0

Вы можете продолжить использовать ленивую загрузку и указать для загрузки дочерних отношений с помощью .Include(). Пример:

using (var context = new BloggingContext()) 
{ 
    // Load all blogs and related posts 
    var blogs1 = context.Blogs 
         .Include(b => b.Posts) 
         .ToList(); 

    // Load one blogs and its related posts 
    var blog1 = context.Blogs 
         .Where(b => b.Name == "ADO.NET Blog") 
         .Include(b => b.Posts) 
         .FirstOrDefault(); 

    // Load all blogs and related posts 
    // using a string to specify the relationship 
    var blogs2 = context.Blogs 
         .Include("Posts") 
         .ToList(); 

    // Load one blog and its related posts 
    // using a string to specify the relationship 
    var blog2 = context.Blogs 
         .Where(b => b.Name == "ADO.NET Blog") 
         .Include("Posts") 
         .FirstOrDefault(); 
} 

Посмотрите на это сообщение: http://msdn.microsoft.com/en-us/data/jj574232.aspx

+0

Спасибо для ответа. Я не могу использовать 'ctx.As.Include (x => x.C)', потому что это не свойство 'A'. У меня проблема с наследованием, а не с Eagerly Loading в целом. Или я что-то пропустил? – jasdefer

Смежные вопросы