我正在尝试实现媒体库系统,我从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,它们具有公共属性(在基类中)和一些不常见的属性。我该如何在数据库中实现它?
我有两个选择:
但问题是,例如,如果我想获得所有图像,LINQ将是:
from m in Repository.GetMedia
where m is Image
select m;
它不会工作,即使它确实如此,我怀疑LINQ是否可以实际加载数据库中的所有数据,然后才能选择一个特定的类型。我在这里错过了什么吗?
答案 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将支持持久存在的无知对象。使用实际版本,这是不可能的。或者不是直接,但这是另一个故事。