2011-09-28 77 views
11

我想在我的Azure项目使用两个不同的数据源:EF与天青 - 混合SQL Server和Windows Azure存储

  • 一个的SQL Server包含基本部分信息关于项目(允许可转位数据和空间搜索)
  • 一个的Windows Azure存储包含满剩余信息有关的项目(通过键检索)

这样我可以结合强大的SQL Server与Windows Azure存储的易扩展性。

想象一下这样的域名POCO类:

class Person 
{ 
    string Id { get; set; } 
    string Name { get; set; } 
    byte[] Picture { get; set; } 
    string Biography { get; set; } 
} 

我想用实体框架用流利的映射,让EF明白性质图片和传记必须从Windows Azure存储(表,BLOB加载)而不是SQL Server(可能是Lazy loaded)。

有EF(或NHibernate)这样做的方法,或者我必须实现自己的ORM策略?

感谢

回答

6

我不认为你可以让EF了解Azure存储,但你只能必要的属性到一个特定的表映射。例如,

modelBuilder.Entity<Person>().Ignore(p => p.Picture); 

所以假设你有一个存储库类的Person类,你希望可以通过填写与Azure存储API和EF库类可以轻松实现什么。

6

在我看来,您正试图解决这个问题太早(在DAL)。看看网页,它会在单独调用服务器的过程中获取大量数据(例如图片)。这已经很好地扩展了。由于某种原因,图片数据不包含在文档本身中,它只会减慢一切,并且不会很容错。如果您将它们放在一个实体中,则您的图片服务器会减慢快速实体检索的速度,因为它们都必须在离开业务层之前走到一起,最后才能进入表示层。而在业务层,这个数据可能只是浪费内存(这就是为什么你想延迟加载它)。所以我认为你做出的决定为时尚早。你描述的域对象看起来像表示层的域对象,类似于ViewModel。我并没有太注重领域驱动设计,但是当您的应用程序有一个通用模型时,我认为应用程序的每个部分都需要该模型的稍微不同的实现。

关于延迟加载,如果启用了该功能,并且您尝试通过线路发送对象,即使Picture未加载,它也会被序列化,因为数据协定序列化程序(或任何其他)会调用get属性。

这可能不是你想要的答案,但我觉得我不得不这样说。当然,我很乐意接受评论和批评。