我想通过存储库模式保留一组实体。
Vanilla SQL非常简单,编写一些具有接收/返回实体的查询的方法。
Azure表存储也非常简单,除了我看到的大多数实现都希望实体从一些常见的Azure基类中降级。 (TableServiceEntity等)
EF也有效,但也希望拥有更多的实体。
是否有一种很好的方法可以抽象出SQL和Azure表格,以便实体可以以任何方式保留?
实际上并不需要双向支持,我们只需要支持两种不同的部署类型。
我希望这些模型尽可能与他们所持有的存储库一样不可知,如果可能的话,尽可能少的依赖(没有?!)。
答案 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