我想在我的网站中使用两种不同的数据源 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; }
}
我想使用具有流畅映射的Entity Framework让EF了解这些属性 必须从Windows Azure存储加载图片和传记 (table,blob)而不是SQL Server(可能是Lazy加载的)。
EF(或NHibernate)有办法实现这一目标,还是我必须实施自己的ORM策略?
谢谢
我认为您不能让EF了解Azure存储,但您只能将必要的属性映射到特定的表。例如,
modelBuilder.Entity<Person>().Ignore(p => p.Picture);
因此,假设您有Person类的存储库类,可以通过使用Azure存储API和EF填充存储库类来轻松实现所需的内容。
在我看来,你过早地(在DAL)试图解决这个问题。查看网络,它在对服务器的单独调用中获取大数据(例如图片)。这已经很好地扩展了。由于某种原因,图片数据不包含在文档本身中,它只会减慢一切,并且不会具有容错能力。如果你将它们放在一个实体中,你就会得到快速的实体检索,它会被你的图片服务器放慢速度,因为它们必须在离开你的业务层然后最终走向表示层之前聚集在一起。在业务层中,这些数据可能只是浪费内存(这就是你想要延迟加载它的原因)。所以我认为你太早做出决定。您描述为域对象的内容对我来说就像是表示层的域对象,类似于ViewModel。我对域驱动设计并不是太大,但是虽然有一个应用程序的通用模型,但我认为应用程序的每个部分都需要稍微不同的模型实现。
关于延迟加载,如果你已启用并且尝试通过网络发送对象,即使未加载图片,它也会被序列化,因为数据合同序列化程序(或任何其他)将调用您的属性上的get。
这可能不是你想要的答案,但我觉得我不得不说这个。当然,我愿意接受评论和批评。