2012-07-18 81 views
1

我有一组我希望通过存储库模式持久存在的实体。在Azure和SQL存储库之间共享模型

香草SQL是相当直接的,写一些方法有采取/返回实体的查询。

Azure的表存储也是相当直接的,但最让我看到了实现的希望实体从一些常见的Azure的基类后裔居住。 (TableServiceEntity等)

EF工作为好,但也希望给自己多一点的实体。

有抽象掉的好方法无论是SQL Azure的并表的东西,这样的实体可以坚持无论哪种方式?

双向的支持是不是真的需要,我们只是将不得不需要支持两种不同的部署类型。

我想这些模型来尽可能他们正在坚持的存储库作为不可知,以尽可能少的依赖关系(没有?)如果可能的话。

+0

我想什么避免是我们目前所在的地方:我们有一些不可知论的模型和实现特定的模型,a nd他们知道如何构建彼此,但这是一个巨大的PITA – 2012-07-18 20:52:30

+0

我们开始使用ValueInjecter和Automapper在模型之间进行切换,这大大减少了问题,但我仍然不喜欢整体概念。 – 2012-08-08 15:42:31

回答

2

这是可行的。我已经帮助建立了一个规模很大的客户端。

1)不要从TableServiceEntity继承,而是落实在你的实体以下属性:

[DataServiceKey(new string[] { "PartitionKey", "RowKey" }), Serializable] 

此外,实施某种在你的实体,它提供PartitionKey,RowKey和时间戳到您的实体的接口。

public interface ITableEntity 
{ 
    string PartitionKey { get; set; } 
    string RowKey { get; set; } 
    DateTime Timestamp { get; set; } 
} 

至少这种方法可以让你拥有自己的继承策略为自己的实体,而不是因缺乏多继承的限制。试着让PartitionKey和RowKey提供一个传递给真正的密钥属性,而不是复制密钥。

public string PartitionKey 
{ 
     get 
     { 
      return this.Id; 
     } 
     set 
     { 
     this.Id = value; 
     } 
} 

2)意识到您的系统中会有两种类型的存储库:关系特定和特定于ATS的存储库。

3)您可以通过EDMX生成你的实体和使用部分类与ITableEntity和DataServiceKey属性

4)注入他们在某些时候,你会需要你的ATS专用仓库做你的实体的一些转换为持久性的缘故,因为你将数据保存到ATS的方式是不一样,你会想在你的域模型(这尤其涉及到分层或关系数据)

HTH