Devlooped.TableStorage.Source 5.2.0
前 置 符 标 识 预 诞
dotnet add package Devlooped.TableStorage.Source --version 5.2.0
NuGet\Install-Package Devlooped.TableStorage.Source -Version 5.2.0
<PackageReference Include="Devlooped.TableStorage.Source" Version="5.2.0" />
paket add Devlooped.TableStorage.Source --version 5.2.0
#r "nuget: Devlooped.TableStorage.Source, 5.2.0"
// Install Devlooped.TableStorage.Source as a Cake Addin #addin nuget:?package=Devlooped.TableStorage.Source&version=5.2.0 // Install Devlooped.TableStorage.Source as a Cake Tool #tool nuget:?package=Devlooped.TableStorage.Source&version=5.2.0
只 读 源 代 码 版 本 的 TableStorage。
支 持 POCO 对 象 存 储 至 Azure/CosmosDB 表 存 储的 存 款 模 式。
注 意:该 库 是 最 新 的 Azure SDK v12+ 表 存储 的 薄 包 装器,并 使 用 CloudStorageAccount,它 是 Azure SDK v11
CloudStorageAccount
类 的 100% 向 后 兼 容 的 实现。
用 法
给 定 一 个 类 据 如 下
public record Product(string Category, string Id)
{
public required string? Title { get; init; }
public double Price { get; init; }
public DateOnly CreatedAt { get; init; }
}
注 意:类 可 以 有 自 定义 构 造 函 数,键 属 性 可 能 是 只 读 的(例 如,此 例 中 的 类 别 和 Id),并且 不 需 要 继 承 任 何 事 物,实 现任 何 接 口 或 使 用 任 何 自 定义 特 性(如 果 不 是 你 想 要 的)。如 所 上 示,它 甚至 可 以 是 一 个 简 单 的 记 录 类 型。
该 类 可 以 用 以 存 储和 检 索
var storageAccount = CloudStorageAccount.DevelopmentStorageAccount; // or production one
// We lay out the parameter names for clarity only.
var repo = TableRepository.Create<Product>(storageAccount,
tableName: "Products",
partitionKey: p => p.Category,
rowKey: p => p.Id);
var product = new Product("book", "1234")
{
Title = "Table Storage is Cool",
Price = 25.5,
};
// Insert or Update behavior (aka "upsert")
await repo.PutAsync(product);
// Enumerate all products in category "book"
await foreach (var p in repo.EnumerateAsync("book"))
Console.WriteLine(p.Price);
// Query books priced in the 20-50 range,
// project just title + price
await foreach (var info in from prod in repo.CreateQuery()
where prod.Price >= 20 and prod.Price <= 50
select new { prod.Title, prod.Price })
Console.WriteLine($"{info.Title}: {info.Price}");
// Get previously saved product.
Product saved = await repo.GetAsync("book", "1234");
// Delete product
await repo.DeleteAsync("book", "1234");
// Can also delete passing entity
await repo.DeleteAsync(saved);
当 已 知 实 体 存 储 布局 时,可 以 使 用 特 性 来消 除 需要 长 记 法 的 必 要 性。
[Table("Products")]
public record Product([PartitionKey] string Category, [RowKey] string Id) ...
var storageAccount = CloudStorageAccount.DevelopmentStorageAccount;
// Everything discovered from attributes.
var repo = TableRepository.Create<Product>(storageAccount);
有关如 何 使用 它 们 的 更多 细节,请 参 阅 下 面 的 属性 部分。
例如,如果产品是书籍,按作者划分可能会有意义。在这种情况下,保存时可以使用TableRepository
public record Book([RowKey] string ISBN, string Title, string Author, BookFormat Format, int Pages);
var repo = TableRepository.Create<Product>(storageAccount, "Books",
partitionKey: x => x.Author);
await repo.PutAsync(book);
注意您可以根据需要混合使用属性和显式lambda表达式。后者具有优先级。
稍后,当通过特定作者列出/过滤书籍时,可以使用TablePartition
,这样所有查询都会自动限定在该作者
var partition = TablePartition.Create<Book>(storageAccount, "Books",
partitionKey: "Rick Riordan");
// Get Rick Riordan books, only from Disney/Hyperion, with over 1000 pages
var query = from book in repo.CreateQuery()
where
book.ISBN.CompareTo("97814231") >= 0 &&
book.ISBN.CompareTo("97814232") < 0 &&
book.Pages >= 1000
select new { book.ISBN, book.Title };
使用表分区处理参考数据也很方便,例如。枚举分区中的所有条目通常不会对您的“真实”数据做,但对于参考数据可能很有用。
注意:如果需要访问Azure Table Storage管理的实体的
Timestamp
,只需声明具有该名称的属性,并使用DateTimeOffset
、DateTime
或string
类型来读取它。
使用TableRepository
和TablePartition
存储的实体使用单个列来存储属性,这使得浏览数据(以及查询,如上述所示!)变得容易。
注意:分区键和行键也可以是
Guid
类型
如果您不需要单独的列,也可以通过DocumentRepository
和DocumentPartition
提供基于文档的存储。
文档存储
DocumentRepository.Create
和DocumentPartition.Create
工厂方法提供对基于文档的存储的访问,公开与列存储类似的API。
文档存储库会将实体持久化为单个文档列,包括类型和版本信息,以处理应用程序级别的版本控制。
API大多与基于列的存储库相同(文档存储库实现了相同的底层ITableStorage
接口)。
public record Product(string Category, string Id)
{
public string? Title { get; init; }
public double Price { get; init; }
public DateOnly CreatedAt { get; init; }
}
var book = new Product("book", "9781473217386")
{
Title = "Neuromancer",
Price = 7.32
};
// Column-based storage
var repo = TableRepository.Create<Product>(
CloudStorageAccount.DevelopmentStorageAccount,
tableName: "Products",
partitionKey: p => p.Category,
rowKey: p => p.Id);
await repo.PutAsync(book);
// Document-based storage
var docs = DocumentRepository.Create<Product>(
CloudStorageAccount.DevelopmentStorageAccount,
tableName: "Documents",
partitionKey: p => p.Category,
rowKey: p => p.Id
serializer: [SERIALIZER]);
await docs.PutAsync(book);
如果没有提供,序列化器默认为基于
System.Text.Json
的DocumentSerializer.Default
。
以下截图中可以看到存储结果差异,[此处省略链接内容]。
存储在文档表中的Type
列是持久化实体的Type.FullName
,而Version
是其程序集的[主版本号.次要版本号]
,可用于高级数据迁移场景。主版本和次要版本组件也作为单独的列提供,以便更容易地使用IDocumentRepository.EnumerateAsync(predicate)
进行各种版本范围的查询。
除了默认内置的基于JSON的纯文本序列化器(使用System.Text.Json包)之外,还有其他基于文档存储库的替代序列化器,包括各种二进制序列化器,这些序列化器将文档持久化为字节数组。
您可以将序列化器传递给工厂方法,如下所示
var repo = TableRepository.Create<Product>(...,
serializer: [JsonDocumentSerializer|BsonDocumentSerializer|MessagePackDocumentSerializer|ProtobufDocumentSerializer].Default);
注意:使用替代序列化器时,实体可能需要用底层库所需的任何属性进行标记。
属性
如果您想避免在工厂方法中使用字符串,也可以注释实体类型以修改默认值。
[Table("tableName")]
:类级别属性,用于在未提供值时更改默认值。[PartitionKey]
:注解应该作为分区键使用的属性。[RowKey]
:注解应该作为行键使用的属性。
传递给工厂方法的值会覆盖声明性属性。
对于上面提到的产品示例,您的记录实体可以是
[Table("Products")]
public record Product([PartitionKey] string Category, [RowKey] string Id)
{
public string? Title { get; init; }
public double Price { get; init; }
}
创建存储库时,除了存储账户外的任何参数都不需要。
var repo = TableRepository.Create<Product>(CloudStorageAccount.DevelopmentStorageAccount);
此外,如果您想从持久化中省略特定的属性,您可以用[Browsable(false)}
注解它,然后在持久化和读取实体时会跳过该属性。
支持表实体
因为这些存储库API比直接操作要直观得多
TableClient
,您可能希望仅通过内置的TableEntity
属性来检索/枚举实体,例如PartitionKey
、RowKey
、Timestamp
和ETag
。在这种情况下,我们也支持通过使用工厂方法TableRepository.Create(...)
和TablePartition.Create(...)
来创建ITableRepository<TableEntity>
和ITablePartition<TableEntity>
,而不需要(泛型的)实体类型参数。
例如,假设您知道上面示例中保存的所有Region
实体,使用区域的Code
作为RowKey
,您可以直接枚举所有区域,而无需使用任何Region
类型。
var account = CloudStorageAccount.DevelopmentStorageAccount; // or production one
var repo = TablePartition.Create(storageAccount,
tableName: "Reference",
partitionKey: "Region");
// Enumerate all regions within the partition as plain TableEntities
await foreach (TableEntity region in repo.EnumerateAsync())
Console.WriteLine(region.RowKey);
您只需使用实体索引器即可访问和添加其他属性,您稍后可以通过调用PutAsync
来持久化这些属性。
await repo.PutAsync(
new TableEntity("Book", "9781473217386")
{
["Title"] = "Neuromancer",
["Price"] = 7.32
});
var entity = await repo.GetAsync("Book", "9781473217386");
Assert.Equal("Neuromancer", entity["Title"]);
Assert.Equal(7.32, (double)entity["Price"]);
赞助商
产品 | 版本 兼容以及附加计算目标框架版本。 |
---|---|
.NET | net5.0 已计算。 net5.0-windows 已计算。 net6.0 已计算。 net6.0-android 已计算。 net6.0-ios 已计算。 net6.0-maccatalyst 已计算。 net6.0-macos 已计算。 net6.0-tvos 已计算。 net6.0-windows 已计算。 net7.0 已计算。 net7.0-android 已计算。 net7.0-ios 已计算。 net7.0-maccatalyst 已计算。 net7.0-macos 已计算。 net7.0-tvos 已计算。 net7.0-windows 已计算。 net8.0 已计算。 net8.0-android 已计算。 net8.0-browser 已计算。 net8.0-ios 已计算。 net8.0-maccatalyst 已计算。 net8.0-macos 已计算。 net8.0-tvos 已计算。 net8.0-windows 已计算。 |
.NET Core | netcoreapp2.0 已计算。 netcoreapp2.1 已计算。 netcoreapp2.2 已计算。 netcoreapp3.0 已计算。 netcoreapp3.1 已计算。 |
.NET 标准化 | netstandard2.0 兼容。 netstandard2.1 兼容。 |
.NET 框架 | net461 已计算。 net462 已计算。 net463 已计算。 net47 已计算。 net471 已计算。 net472 已计算。 net48 已计算。 net481 已计算。 |
MonoAndroid | monoandroid 已计算。 |
MonoMac | monomac 已计算。 |
MonoTouch | monotouch 已计算。 |
Tizen | tizen40 已计算。 tizen60 已计算。 |
Xamarin.iOS | xamarinios 已计算。 |
Xamarin.Mac | xamarinmac 已计算。 |
Xamarin.TVOS | xamarintvos 已计算。 |
Xamarin.WatchOS | xamarinwatchos 已计算。 |
-
.NETStandard 2.0
- Azure.Data.Tables (>= 12.8.2)
- Devlooped.CloudStorageAccount (>= 1.2.0)
- Microsoft.OData.Client (>= 7.17.0)
- System.Text.Json (>= 6.0.6)
-
.NETStandard 2.1
- Azure.Data.Tables (>= 12.8.2)
- Devlooped.CloudStorageAccount (>= 1.2.0)
- Microsoft.OData.Client (>= 7.17.0)
- System.Text.Json (>= 6.0.6)
NuGet 包 (4)
显示依赖于 Devlooped.TableStorage.Source 的前 4 个 NuGet 包
包 | 下 载 |
---|---|
Devlooped.TableStorage.Protobuf.Source 用于与文档存储库一起使用的仅源代码 Protocol Buffers 二进制序列化器。 |
|
Devlooped.TableStorage.Bson.Source 用于与文档存储库一起使用的仅源代码 BSON 二进制序列化器。 |
|
Devlooped.TableStorage.MessagePack.Source 用于与文档存储库一起使用的仅源代码 MessagePack 二进制序列化器。 |
|
Devlooped.TableStorage.Newtonsoft.Source 用于与文档存储库一起使用的基于 Newtonsoft.Json 的仅源代码序列化器。 |
GitHub 仓库
该包未被任何流行的 GitHub 仓库使用。
版本 | 下 载 | 最后更新 |
---|---|---|
5.2.0 | 85 | 7/24/2024 |
5.2.0-rc.1 | 39 | 7/13/2024 |
5.2.0-rc | 138 | 7/10/2024 |
5.2.0-beta | 159 | 7/6/2024 |
5.1.2 | 401 | 1/25/2024 |
5.1.1 | 941 | 10/4/2023 |
5.1.0 | 884 | 8/11/2023 |
5.0.2 | 738 | 8/8/2023 |
5.0.1 | 345 | 7/25/2023 |
5.0.0 | 447 | 7/25/2023 |
4.3.1 | 479 | 7/24/2023 |
4.3.0 | 392 | 6/27/2023 |
4.2.1 | 518 | 4/17/2023 |
4.2.0 | 670 | 3/28/2023 |
4.1.3 | 845 | 1/20/2023 |
4.1.2 | 909 | 1/16/2023 |
4.0.0 | 1,445 | 8/26/2022 |
4.0.0-rc.1 | 93 | 8/26/2022 |
4.0.0-rc | 779 | 8/15/2022 |
4.0.0-beta | 762 | 5/17/2022 |
4.0.0-alpha | 707 | 5/4/2022 |
3.2.0 | 1,282 | 12/13/2021 |
3.1.1 | 1,252 | 8/29/2021 |
3.1.0 | 1,332 | 8/13/2021 |
3.0.3 | 1,251 | 7/28/2021 |
3.0.2 | 1,275 | 7/1/2021 |
2.0.2 | 1,278 | 6/23/2021 |
2.0.1 | 1,381 | 6/17/2021 |
2.0.0 | 1,425 | 6/16/2021 |
1.3.0 | 1,035 | 5/31/2021 |
1.2.1 | 478 | 5/29/2021 |
1.2.0 | 418 | 5/26/2021 |
1.1.1 | 413 | 5/26/2021 |
1.1.0 | 398 | 5/26/2021 |
1.0.4 | 412 | 5/16/2021 |