在Azure和SQL存储库之间共享模型

时间:2012-07-18 20:51:46

标签: sql entity-framework azure repository abstraction

我想通过存储库模式保留一组实体。

Vanilla SQL非常简单,编写一些具有接收/返回实体的查询的方法。

Azure表存储也非常简单,除了我看到的大多数实现都希望实体从一些常见的Azure基类中降级。 (TableServiceEntity等)

EF也有效,但也希望拥有更多的实体。

是否有一种很好的方法可以抽象出SQL和Azure表格,以便实体可以以任何方式保留?

实际上并不需要双向支持,我们只需要支持两种不同的部署类型。

我希望这些模型尽可能与他们所持有的存储库一样不可知,如果可能的话,尽可能少的依赖(没有?!)。

1 个答案:

答案 0 :(得分:2)

这是可行的。我帮助建立了一个规模相当大的客户。

1)不要继承TableServiceEntity,而是在实体上实现以下属性:

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

此外,在您的实体上实现某种类型的接口,为您的实体提供PartitionKey,RowKey和Timestamp。

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