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                
该 指 令 用 于 Vi su al Studio 的 包 管理器 控 制 台 中,因 为 它 使 用 NuGet 模 块 的 Install-Package 版 本。
<PackageReference Include="Devlooped.TableStorage.Source" Version="5.2.0" />                
对 支 持 包 引 用 的 项 目,请 将 此 XML 节 点 复 制 到 项 目 文 件 中 以 引 用 该 包。
paket add Devlooped.TableStorage.Source --version 5.2.0                
#r "nuget: Devlooped.TableStorage.Source, 5.2.0"                
#r 指 令 可 用 于 F# 交 互 和 非 单 一 语 言 笔 记 本 中。将 此 复 制 到 交 互 工具 或 脚 本 的 源 代 码 中 以 引 用 该 包。
// 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 表 存 储的 存 款 模 式。

Screenshot of basic usage

注 意:该 库 是 最 新 的 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,只需声明具有该名称的属性,并使用DateTimeOffsetDateTimestring类型来读取它。

使用TableRepositoryTablePartition存储的实体使用单个列来存储属性,这使得浏览数据(以及查询,如上述所示!)变得容易。

注意:分区键和行键也可以是Guid类型

如果您不需要单独的列,也可以通过DocumentRepositoryDocumentPartition提供基于文档的存储。

文档存储

DocumentRepository.CreateDocumentPartition.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.JsonDocumentSerializer.Default

以下截图中可以看到存储结果差异,[此处省略链接内容]。

Screenshot of entity persisted with separate columns for properties

Screenshot of entity persisted as a document

存储在文档表中的Type列是持久化实体的Type.FullName,而Version是其程序集的[主版本号.次要版本号],可用于高级数据迁移场景。主版本和次要版本组件也作为单独的列提供,以便更容易地使用IDocumentRepository.EnumerateAsync(predicate)进行各种版本范围的查询。

除了默认内置的基于JSON的纯文本序列化器(使用System.Text.Json包)之外,还有其他基于文档存储库的替代序列化器,包括各种二进制序列化器,这些序列化器将文档持久化为字节数组。

Json.NET Bson MessagePack Protobuf

您可以将序列化器传递给工厂方法,如下所示

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属性来检索/枚举实体,例如PartitionKeyRowKeyTimestampETag。在这种情况下,我们也支持通过使用工厂方法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"]);

赞助商

Clarius Org Kirill Osenkov MFB Technologies, Inc. Stephen Shaw Torutek DRIVE.NET, Inc. Ashley Medway Keith Pickford Thomas Bolon Kori Francis Toni Wenzel Giorgi Dalakishvili Uno Platform Dan Siegel Reuben Swartz Jacob Foshee alternate text is missing from this package README image Eric Johnson Ix Technologies B.V. David JENNI Jonathan Oleg Kyrylchuk Charley Wu Jakob Tikjøb Andersen Seann Alexander Tino Hager Mark Seemann Ken Bonny Simon Cropp agileworks-eu sorahex Zheyu Shen Vezel ChilliCream 4OTC

赞助此项目

了解更多关于GitHub赞助商的信息

产品 兼容以及附加计算目标框架版本。
.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 已计算。
兼容的目标框架
包含的目标框架(在包中)
了解更多关于 目标框架.NET 标准化 的信息。

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