代码之家  ›  专栏  ›  技术社区  ›  xandy

可液化管线,继承ORM模型

  •  0
  • xandy  · 技术社区  · 15 年前

    我试图实现一个媒体库系统,我从poco开始我的设计。我计划将实际的数据访问与对象分离,这样,我可以在xml或sql中持久化同一对象。

    我的设计是:

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

    如您所见,图像/电影是从媒体基类继承的。我的问题是数据库设计,对于图像和电影,它们有共同的属性(在基类中)和一些不常见的属性。我应该如何在数据库中实现这一点?

    我有两个选择:

    1. 使用不同的图像和电影表格。
    2. 使用一个表保存公共属性,并使用db中的mediatype(int)字段来区分类型。

    但问题是,例如,如果我想获得所有图像,linq将是:

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

    即使这样,它也不会工作,我怀疑linq是否真的可以在选择特定类型之前从数据库中加载所有数据。我是不是丢了什么东西?

    1 回复  |  直到 15 年前
        1
  •  0
  •   Arthur    15 年前

    不要把linq和mapper混在一起!对于实体框架,您有更多的选项(每种类型的表: http://msdn.microsoft.com/en-us/library/bb738685.aspx )

    你需要的是提供不同的可液化资源。一个给你的或映射器(linqtoenties),一个给一个memoryarray。

    像这样的事情应该行得通。 伪代码!

    public class Repository
    {
        private bool UseEntityFrameWork = Properties.Settings.UseEntityFrameWork;
    
        IQueryalable<MediaBase> Media 
        {
            get
            {
                if(UseEntityFrameWork) return _myEFContext.MediaBase;
                else return _myMemoryArrayOfMediaBase;
            }
        }
    }
    

    它不起作用,即使起作用,我 怀疑linq是否真的可以加载所有 数据库中的数据 选择特定类型输出。我是 这里少了什么?

    不!这取决于您的或映射器。实体框架将完成这项工作。

    我打算把实际的 从对象访问数据,以便 可以在XML中保持相同的对象,或者 sql。

    ADO.NET团队承诺在实体框架的.NET4.0版本中将支持持续存在的无知对象。对于实际版本,这是不可能的。或者不是直接的,但那是另一个故事。