IQueryable管道,具有继承ORM模型

时间:2010-03-24 14:48:24

标签: inheritance orm repository iqueryable

我正在尝试实现媒体库系统,我从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类。我的问题在于数据库设计,对于Image和Movie,它们具有公共属性(在基类中)和一些不常见的属性。我该如何在数据库中实现它?

我有两个选择:

  1. 为图像和电影使用不同的表格。
  2. 使用一个表来保存公共属性,并使用db中的MediaType(int)字段来区分类型。
  3. 但问题是,例如,如果我想获得所有图像,LINQ将是:

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

    它不会工作,即使它确实如此,我怀疑LINQ是否可以实际加载数据库中的所有数据,然后才能选择一个特定的类型。我在这里错过了什么吗?

1 个答案:

答案 0 :(得分:0)

不要将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。实体框架将完成这项工作。

  

我打算将实际去耦   从对象访问数据,我   可以在XML或XML中保留相同的对象   SQL。

ADO.NET团队承诺,.NET 4.0版本的Entity Framework将支持持久存在的无知对象。使用实际版本,这是不可能的。或者不是直接,但这是另一个故事。