【问题标题】:Share a model between Azure and SQL Repositories在 Azure 和 SQL 存储库之间共享模型
【发布时间】:2012-07-18 20:51:46
【问题描述】:

我有一组实体,我想通过存储库模式进行持久化。

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

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

EF 也可以,但也想拥有更多实体。

有没有一种很好的方法来抽象出 SQL 和 Azure 表的内容,以便实体可以以任何一种方式持久化?

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

我希望模型尽可能不依赖于它们被持久化的存储库,尽可能少的依赖项(没有?!)。

【问题讨论】:

  • 我想避免的是我们目前所处的位置:我们有一些不可知论的模型和特定于实现的模型,它们知道如何相互构建,但这是一个巨大的 PITA
  • 我们开始使用 ValueInjecter 和 Automapper 在模型之间进行切换,这大大减少了问题,但我仍然不喜欢整体概念。

标签: sql entity-framework azure repository abstraction


【解决方案1】:

这是可行的。我已经帮助一个相当大的客户构建了这个。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-04
    • 1970-01-01
    • 1970-01-01
    • 2022-10-24
    • 1970-01-01
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多