EF与Azure - 混合SQL Server和Windows Azure存储

Ric*_*ald 11 orm entity-framework azure azure-storage

我想在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; }
}
Run Code Online (Sandbox Code Playgroud)

我想使用具有流畅映射的Entity Framework让EF了解必须从Windows Azure存储(table,blob)而不是SQL Server(可能是Lazy加载)加载属性Picture和Biography.

EF(或NHibernate)有一种方法可以做到这一点,或者我必须实现自己的ORM策略?

谢谢

Tae*_*hin 6

我认为您不能让EF了解Azure存储,但您只能将必要的属性映射到特定的表.例如,

 modelBuilder.Entity<Person>().Ignore(p => p.Picture); 
Run Code Online (Sandbox Code Playgroud)

因此,假设您有Person类的存储库类,通过使用Azure存储API和EF填充存储库类可以轻松实现所需的功能.


And*_*eas 6

在我看来,你试图过早解决这个问题(在DAL).查看网络,它会在单独的服务器调用中获取大量数据(例如图片).这已经很好地扩展了.由于某种原因,图片数据不包含在文档本身中,它只会减慢所有内容的速度,并且不会具有很强的容错能力.如果你把它们放在一个实体中,你就会得到快速的实体检索,它会被你的图片服务器放慢速度,因为它们必须在离开你的业务层然后最终走向表示层之前聚集在一起.在业务层中,这些数据可能只是在浪费内存(这就是你想要延迟加载它的原因).所以我认为你太早做出决定.您描述为域对象的内容对我来说就像是表示层的域对象,类似于ViewModel.我对域驱动设计并不是太大,但是虽然有一个应用程序的通用模型,但我认为应用程序的每个部分都需要稍微不同的模型实现.

关于延迟加载,如果启用了并且尝试通过网络发送对象,即使未加载图片,它也会被序列化,因为数据合同序列化程序(或任何其他)将调用您的属性上的get.

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