2016-06-24 3 views
0

Я работаю на веб-сайте социальных медиа, мы разрабатываем систему уведомлений Facebook стиль enter image description hereЗагрузка свойств навигации на производный класс в EF

Проблема заключается в том, что у нас есть Notification базовый класс и существует много различных производных классов уведомлений как MentionNotification, LikeNotification.

This производных классов много раз имеют свои собственные навигационные свойства, так что мы должны изменить NotificationRepository, чтобы включить все эти новые навигационные свойства,

я не могу найти способ, чтобы избежать изменений в хранилище базы избежать N +- запрос.

Любая идея будет приветствоваться

ответ

0

Если вы используете Table Per Type ... Тогда ...

public class MyContext : DbContext 
{ 
    public virtual DbSet<NotificationBase> Notifications { get; set; } 
} 

var mns = await MyContext.Notifications 
    .OfType<MentionNotification>() 
    .Include(mn => mn.SomeProperty) 
    .ToListAsync(); 

(Off верхней части моей головы, я уверен, что это что-то вроде этого. ..)

+0

Идея заключается в создании чего-то, что не нужно менять базу репозитория уведомлений каждый раз, когда мне нужно добавить новый тип уведомления в систему. И он загружает все уведомления и его навигационные свойства. вызов notificationRepository.All() возвращает все уведомления в системе с загруженными навигационными свойствами. Если я добавлю новый проект с новым типом уведомлений, я все равно могу вызвать уведомлениеRepository.All() и новый тип также возвращается. – Deumber

+0

Я не думаю, что это должно быть сделано только в одном запросе, потому что, возможно, сгенерированный запрос настолько трудоемкий, что мы все еще можем получать тайм-ауты, но может быть немного более умным, чтобы загружать уведомления типа и делать союзы, хотя худшее случай здесь будет N + 1. Просто играйте с разными идеями, чтобы решить эту проблему. – Deumber

+0

Если это время, похоже, у вас есть [Декартовой продукт] (http://stackoverflow.com/questions/22161234/optimize-entity-framework-query/22625208#22625208) проблема. –