IQueryable трубопровод, с наследующей моделью ORM - PullRequest
0 голосов
/ 24 марта 2010

Я пытаюсь внедрить систему медиатек, и я начал свой проект с POCO. Я планирую отделить фактический доступ к данным от объекта, чтобы я мог сохранить тот же объект в XML или SQL.

Что у меня есть в дизайне:

public abstract class MediaBase {}
public class Image : MediaBase {}
public class Movie : MediaBase {}
public class Document: MediaBase{}
... // more classes inherits from base

Как видите, изображение / фильм наследуется от класса Media Base. Моя проблема с дизайном базы данных, для изображений и фильмов, они имеют общие свойства (в базовом классе) и некоторые необычные свойства. Как мне реализовать это в базе данных?

У меня есть два варианта:

  1. Используйте разные таблицы для изображений и фильмов.
  2. Используйте одну таблицу для хранения общих свойств и используйте поле MediaType (int) в db, чтобы различать тип.

Но проблема, например, в том, что если я хочу получить все изображения, LINQ будет:

from m in Repository.GetMedia
where m is Image
select m;

Это не будет работать, даже если это так, я сомневаюсь, что LINQ действительно загрузит все данные из базы данных, прежде чем сможет выбрать определенный тип. Я что-то здесь упускаю?

1 Ответ

0 голосов
/ 24 марта 2010

Не смешивайте LINQ с OR Mapper! С Entity Framework у вас есть больше возможностей (Таблица для каждого типа: http://msdn.microsoft.com/en-us/library/bb738685.aspx)

Вам нужно предоставить различные источники IQueryalable. Один для вашего OR Mapper (LinqToEntities) и один для MemoryArray.

Нечто подобное должно работать. Pseodocode!

public class Repository
{
    private bool UseEntityFrameWork = Properties.Settings.UseEntityFrameWork;

    IQueryalable<MediaBase> Media 
    {
        get
        {
            if(UseEntityFrameWork) return _myEFContext.MediaBase;
            else return _myMemoryArrayOfMediaBase;
        }
    }
}

Это не будет работать, даже если я это сделаю сомневаюсь, что LINQ может действительно загрузить все данные из базы данных, прежде чем он может выберите определенный тип. Я здесь чего-то не хватает?

Нет! Это зависит от вашего OR Mapper. Entity Framework сделает эту работу.

Я планирую отделить фактическое доступ к данным от объекта, так что я может сохраняться тот же объект в XML или SQL.

Команда ADO.NET обещает, что невежественные объекты будут поддерживаться в .NET 4.0 версии Entity Framework. С реальной версией это было бы невозможно. Или не напрямую, но это другая история.

...