I-Synergy.Framework.EntityFramework 2025.11211.11225-preview

Prefix Reserved
This is a prerelease version of I-Synergy.Framework.EntityFramework.
There is a newer version of this package available.
See the version list below for details.
dotnet add package I-Synergy.Framework.EntityFramework --version 2025.11211.11225-preview
                    
NuGet\Install-Package I-Synergy.Framework.EntityFramework -Version 2025.11211.11225-preview
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="I-Synergy.Framework.EntityFramework" Version="2025.11211.11225-preview" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="I-Synergy.Framework.EntityFramework" Version="2025.11211.11225-preview" />
                    
Directory.Packages.props
<PackageReference Include="I-Synergy.Framework.EntityFramework" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add I-Synergy.Framework.EntityFramework --version 2025.11211.11225-preview
                    
#r "nuget: I-Synergy.Framework.EntityFramework, 2025.11211.11225-preview"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package I-Synergy.Framework.EntityFramework@2025.11211.11225-preview
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=I-Synergy.Framework.EntityFramework&version=2025.11211.11225-preview&prerelease
                    
Install as a Cake Addin
#tool nuget:?package=I-Synergy.Framework.EntityFramework&version=2025.11211.11225-preview&prerelease
                    
Install as a Cake Tool

I-Synergy Framework Entity Framework

A comprehensive Entity Framework Core integration library for .NET 10.0 applications, providing base entity classes, multi-tenancy support, soft delete capabilities, automatic auditing, and powerful repository extensions. This package streamlines database operations while promoting clean architecture principles.

NuGet License .NET

Features

  • Base entity classes with automatic audit fields (CreatedDate, CreatedBy, ChangedDate, ChangedBy)
  • Multi-tenancy support with automatic tenant filtering using query filters
  • Soft delete functionality with query filter integration
  • DbContext extensions for common CRUD operations with Mapster integration
  • ModelBuilder extensions for configuring versioning, decimal precision, and filters
  • Queryable extensions for pagination support
  • Entity events for tracking inserts, updates, and deletes
  • Attribute-based filtering to selectively ignore soft delete or versioning
  • Identity integration with AspNetCore.Identity.EntityFrameworkCore
  • Type-safe operations with full async/await support

Installation

Install the package via NuGet:

dotnet add package I-Synergy.Framework.EntityFramework

Quick Start

1. Create Entity Classes

using ISynergy.Framework.EntityFramework.Base;

// Simple entity with audit fields
public class Product : BaseEntity
{
    public int Id { get; set; }
    public string Name { get; set; } = string.Empty;
    public decimal Price { get; set; }
    public string Category { get; set; } = string.Empty;
}

// Multi-tenant entity with automatic tenant filtering
public class Order : BaseTenantEntity
{
    public int Id { get; set; }
    public string OrderNumber { get; set; } = string.Empty;
    public decimal TotalAmount { get; set; }
    public DateTime OrderDate { get; set; }
    // TenantId is inherited from BaseTenantEntity
}

// Entity that ignores soft delete
[IgnoreSoftDelete]
public class AuditLog : BaseEntity
{
    public int Id { get; set; }
    public string Action { get; set; } = string.Empty;
    public DateTime Timestamp { get; set; }
}

2. Configure DbContext

using ISynergy.Framework.EntityFramework.Extensions;
using Microsoft.EntityFrameworkCore;

public class ApplicationDbContext : DbContext
{
    private readonly IScopedContextService _contextService;

    public ApplicationDbContext(
        DbContextOptions<ApplicationDbContext> options,
        IScopedContextService contextService)
        : base(options)
    {
        _contextService = contextService;
    }

    public DbSet<Product> Products { get; set; }
    public DbSet<Order> Orders { get; set; }
    public DbSet<AuditLog> AuditLogs { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        // Apply decimal precision for currency fields
        modelBuilder.ApplyDecimalPrecision("decimal(18, 2)");

        // Apply versioning (automatic Version field management)
        modelBuilder.ApplyVersioning();

        // Apply soft delete filters (excludes IsDeleted = true)
        modelBuilder.ApplySoftDeleteFilters();

        // Apply tenant filters for multi-tenant entities
        modelBuilder.ApplyTenantFilters(() =>
            _contextService.GetContext<AppContext>().TenantId);

        // Apply entity configurations from assemblies
        modelBuilder.ApplyModelBuilderConfigurations(new[]
        {
            typeof(ApplicationDbContext).Assembly
        });
    }
}

3. Use DbContext Extensions

using ISynergy.Framework.EntityFramework.Extensions;

public class ProductService
{
    private readonly ApplicationDbContext _context;

    public ProductService(ApplicationDbContext context)
    {
        _context = context;
    }

    // Check if product exists
    public async Task<bool> ProductExistsAsync(string name, CancellationToken cancellationToken)
    {
        return await _context.ExistsAsync<Product>(
            p => p.Name == name,
            cancellationToken);
    }

    // Get product by ID
    public async Task<Product?> GetProductByIdAsync(int id, CancellationToken cancellationToken)
    {
        return await _context.GetItemByIdAsync<Product, int>(id, cancellationToken);
    }

    // Get product as DTO
    public async Task<ProductDto?> GetProductDtoAsync(int id, CancellationToken cancellationToken)
    {
        return await _context.GetItemByIdAsync<Product, ProductDto, int>(
            id,
            cancellationToken);
    }

    // Add product
    public async Task<int> AddProductAsync(ProductDto dto, CancellationToken cancellationToken)
    {
        return await _context.AddItemAsync<Product, ProductDto>(dto, cancellationToken);
    }

    // Update product
    public async Task<int> UpdateProductAsync(ProductDto dto, CancellationToken cancellationToken)
    {
        return await _context.UpdateItemAsync<Product, ProductDto>(dto, cancellationToken);
    }

    // Add or update product (upsert)
    public async Task<int> UpsertProductAsync(ProductDto dto, CancellationToken cancellationToken)
    {
        return await _context.AddUpdateItemAsync<Product, ProductDto>(
            dto,
            cancellationToken);
    }

    // Soft delete product
    public async Task<int> SoftDeleteProductAsync(int id, CancellationToken cancellationToken)
    {
        return await _context.RemoveItemAsync<Product, int>(
            id,
            cancellationToken,
            soft: true);
    }

    // Hard delete product
    public async Task<int> DeleteProductAsync(int id, CancellationToken cancellationToken)
    {
        return await _context.RemoveItemAsync<Product, int>(
            id,
            cancellationToken,
            soft: false);
    }
}

Architecture

Base Entity Classes

ISynergy.Framework.EntityFramework.Base/
├── BaseEntity                  # Base class with audit fields
│   ├── Memo                   # Optional memo field
│   ├── CreatedDate            # Creation timestamp
│   ├── CreatedBy              # User who created the record
│   ├── ChangedDate            # Last modification timestamp
│   └── ChangedBy              # User who last modified the record
│
└── BaseTenantEntity           # BaseEntity + TenantId
    └── TenantId               # Tenant identifier for multi-tenancy

Extension Methods

ISynergy.Framework.EntityFramework.Extensions/
├── DbContextExtensions         # CRUD operations
│   ├── ExistsAsync<TEntity>
│   ├── GetItemByIdAsync<TEntity, TId>
│   ├── GetItemByIdAsync<TEntity, TModel, TId>
│   ├── AddItemAsync<TEntity, TModel>
│   ├── UpdateItemAsync<TEntity, TModel>
│   ├── AddUpdateItemAsync<TEntity, TModel>
│   └── RemoveItemAsync<TEntity, TId>
│
├── ModelBuilderExtensions      # Configuration helpers
│   ├── ApplyDecimalPrecision
│   ├── ApplyVersioning
│   ├── ApplySoftDeleteFilters
│   ├── ApplyTenantFilters
│   └── ApplyModelBuilderConfigurations
│
└── QueryableExtensions         # Query helpers
    ├── CountPages<TEntity>
    └── ToPage<TEntity>

Core Features

Multi-Tenancy Support

Automatically filter queries by tenant ID:

// Define tenant-aware entity
[TenantAware(nameof(TenantId))]
public class Invoice : BaseTenantEntity
{
    public int Id { get; set; }
    public string InvoiceNumber { get; set; } = string.Empty;
    public decimal Amount { get; set; }
}

// Configure tenant filtering in DbContext
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    // Get tenant ID from scoped context
    modelBuilder.ApplyTenantFilters(() =>
        _contextService.GetContext<AppContext>().TenantId);
}

// All queries automatically filter by tenant
public async Task<List<Invoice>> GetInvoicesAsync()
{
    // Only returns invoices for the current tenant
    return await _context.Invoices.ToListAsync();
}

Soft Delete

Mark records as deleted without removing them from the database:

// Enable soft delete filtering
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.ApplySoftDeleteFilters();
}

// Soft delete a record
await _context.RemoveItemAsync<Product, int>(productId, cancellationToken, soft: true);

// Excluded from queries automatically
var products = await _context.Products.ToListAsync(); // Doesn't include soft-deleted

// Optionally ignore soft delete for specific entities
[IgnoreSoftDelete]
public class ArchivedOrder : BaseEntity
{
    // This entity will not use soft delete filtering
}

Automatic Versioning

Track entity versions for optimistic concurrency:

// Configure versioning
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.ApplyVersioning(); // Default version = 1
}

// Entities automatically get a Version property
var product = await _context.Products.FindAsync(1);
Console.WriteLine(product.Version); // 1

// Version increments on update
product.Name = "Updated Name";
await _context.SaveChangesAsync();
Console.WriteLine(product.Version); // 2

// Ignore versioning for specific entities
[IgnoreVersioning]
public class LogEntry : BaseEntity
{
    // No version tracking
}

Pagination

Easily implement pagination in queries:

using ISynergy.Framework.EntityFramework.Extensions;

public async Task<PagedResult<ProductDto>> GetProductsPagedAsync(
    int pageIndex,
    int pageSize,
    CancellationToken cancellationToken)
{
    var query = _context.Products
        .Where(p => p.IsActive)
        .OrderBy(p => p.Name);

    var totalPages = query.CountPages(pageSize);
    var totalItems = await query.CountAsync(cancellationToken);

    var items = await query
        .ToPage(pageIndex, pageSize)
        .Select(p => new ProductDto
        {
            Id = p.Id,
            Name = p.Name,
            Price = p.Price
        })
        .ToListAsync(cancellationToken);

    return new PagedResult<ProductDto>
    {
        Items = items,
        PageIndex = pageIndex,
        PageSize = pageSize,
        TotalPages = totalPages,
        TotalItems = totalItems
    };
}

Advanced Features

Custom Entity Configuration

Use IEntityTypeConfiguration for complex mappings:

public class ProductConfiguration : IEntityTypeConfiguration<Product>
{
    public void Configure(EntityTypeBuilder<Product> builder)
    {
        builder.HasKey(p => p.Id);

        builder.Property(p => p.Name)
            .IsRequired()
            .HasMaxLength(200);

        builder.Property(p => p.Price)
            .HasColumnType("decimal(18, 2)");

        builder.HasIndex(p => p.Category);
    }
}

// Apply configurations
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.ApplyModelBuilderConfigurations(new[]
    {
        typeof(ApplicationDbContext).Assembly,
        typeof(Product).Assembly
    });
}

Entity Events

Track entity changes for auditing or notifications:

using ISynergy.Framework.EntityFramework.Events;

public class EntityEventListener
{
    private readonly IMessengerService _messenger;

    public EntityEventListener(IMessengerService messenger)
    {
        _messenger = messenger;

        // Subscribe to entity events
        _messenger.Register<EntityInsertedEvent<Product>>(this, OnProductInserted);
        _messenger.Register<EntityUpdatedEvent<Product>>(this, OnProductUpdated);
        _messenger.Register<EntityDeletedEvent<Product>>(this, OnProductDeleted);
    }

    private void OnProductInserted(EntityInsertedEvent<Product> evt)
    {
        // Handle product inserted
        Console.WriteLine($"Product {evt.Entity.Name} was inserted");
    }

    private void OnProductUpdated(EntityUpdatedEvent<Product> evt)
    {
        // Handle product updated
        Console.WriteLine($"Product {evt.Entity.Name} was updated");
    }

    private void OnProductDeleted(EntityDeletedEvent<Product> evt)
    {
        // Handle product deleted
        Console.WriteLine($"Product was deleted");
    }
}

Combining Filters

Combine multiple query filters (tenant + soft delete):

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    // Soft delete filter
    modelBuilder.ApplySoftDeleteFilters();

    // Tenant filter (combines with soft delete automatically)
    modelBuilder.ApplyTenantFilters(() =>
        _contextService.GetContext<AppContext>().TenantId);

    // Queries now filter by both tenant and soft delete
    // SELECT * FROM Products WHERE TenantId = @tenantId AND IsDeleted = 0
}

Working with Mapster

The library uses Mapster for object mapping:

// Define DTOs
public class ProductDto : BaseModel
{
    public int Id { get; set; }
    public string Name { get; set; } = string.Empty;
    public decimal Price { get; set; }
}

// Configure Mapster mapping (if needed)
TypeAdapterConfig<Product, ProductDto>.NewConfig()
    .Map(dest => dest.Name, src => src.Name.ToUpper());

// Use with DbContext extensions
var dto = new ProductDto { Name = "Widget", Price = 9.99m };
await _context.AddItemAsync<Product, ProductDto>(dto, cancellationToken);

Best Practices

Use DbContext extensions for common CRUD operations to reduce boilerplate and ensure consistency.

Always apply ApplySoftDeleteFilters() before ApplyTenantFilters() to ensure proper filter combination.

DbContext extensions automatically include navigation properties when retrieving entities.

Entity Design

  • Inherit from BaseEntity for standard entities with audit fields
  • Inherit from BaseTenantEntity for multi-tenant entities
  • Use [IgnoreSoftDelete] for entities that should never be soft-deleted (audit logs, etc.)
  • Use [IgnoreVersioning] for entities that don't need version tracking
  • Keep entities focused on data structure, not business logic

DbContext Configuration

  • Apply filters in the correct order: Versioning → Soft Delete → Tenant
  • Use ApplyModelBuilderConfigurations() to auto-discover entity configurations
  • Configure decimal precision consistently across the database
  • Use dependency injection to access scoped context for tenant filtering

Repository Pattern

  • Use DbContext extensions for simple CRUD operations
  • Create repositories for complex queries or domain-specific operations
  • Always propagate CancellationToken to database operations
  • Prefer async methods for all database operations

Multi-Tenancy

  • Store tenant ID in scoped context (per request)
  • Apply tenant filters at the DbContext level, not in repositories
  • Use BaseTenantEntity for all tenant-specific data
  • Never trust client-provided tenant IDs - always get from authenticated context

Testing

The framework is designed for testability with in-memory databases:

[TestClass]
public class ProductServiceTests
{
    private ApplicationDbContext _context;

    [TestInitialize]
    public void Setup()
    {
        var options = new DbContextOptionsBuilder<ApplicationDbContext>()
            .UseInMemoryDatabase("TestDb")
            .ConfigureWarnings(b => b.Ignore(InMemoryEventId.TransactionIgnoredWarning))
            .Options;

        var mockContextService = new Mock<IScopedContextService>();
        _context = new ApplicationDbContext(options, mockContextService.Object);
        _context.Database.EnsureDeleted();
        _context.Database.EnsureCreated();
    }

    [TestMethod]
    public async Task GetItemByIdAsync_ReturnsEntity_WhenExists()
    {
        // Arrange
        var product = new Product { Id = 1, Name = "Test" };
        _context.Products.Add(product);
        await _context.SaveChangesAsync();

        // Act
        var result = await _context.GetItemByIdAsync<Product, int>(
            1,
            CancellationToken.None);

        // Assert
        Assert.IsNotNull(result);
        Assert.AreEqual("Test", result.Name);
    }

    [TestMethod]
    public async Task AddItemAsync_AddsEntity()
    {
        // Arrange
        var dto = new ProductDto { Name = "Widget", Price = 9.99m };

        // Act
        await _context.AddItemAsync<Product, ProductDto>(dto, CancellationToken.None);

        // Assert
        Assert.AreEqual(1, _context.Products.Count());
    }
}

Dependencies

  • ISynergy.Framework.Core - Core abstractions and base classes
  • Microsoft.AspNetCore.Identity.EntityFrameworkCore - Identity integration
  • Mapster - Object-to-object mapping
  • Microsoft.EntityFrameworkCore - Entity Framework Core runtime

Migration Scenarios

Adding Multi-Tenancy to Existing Application

// 1. Change entities to inherit from BaseTenantEntity
public class Product : BaseTenantEntity  // Was: BaseEntity
{
    // Properties remain the same
}

// 2. Create migration to add TenantId column
dotnet ef migrations add AddTenantIdToProducts

// 3. Update DbContext to apply tenant filters
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.ApplyTenantFilters(() =>
        _contextService.GetContext<AppContext>().TenantId);
}

// 4. Populate TenantId for existing data
UPDATE Products SET TenantId = '00000000-0000-0000-0000-000000000000'
WHERE TenantId IS NULL;

Documentation

For more information about the I-Synergy Framework:

  • I-Synergy.Framework.Core - Core framework components
  • I-Synergy.Framework.CQRS - CQRS implementation with EF integration
  • I-Synergy.Framework.AspNetCore - ASP.NET Core integration
  • I-Synergy.Framework.Mvvm - MVVM framework for UI applications

Support

For issues, questions, or contributions, please visit the GitHub repository.

Product Compatible and additional computed target framework versions.
.NET net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
2026.10105.11358-preview 47 1/5/2026
2026.10105.11229-preview 51 1/5/2026
2025.11231.11750-preview 78 12/31/2025
2025.11225.12213 174 12/25/2025
2025.11225.12003-preview 167 12/25/2025
2025.11218.11301 266 12/18/2025
2025.11218.10050-preview 262 12/18/2025
2025.11211.11307-preview 400 12/11/2025
2025.11211.11225-preview 399 12/11/2025
2025.11210.10145-preview 423 12/10/2025
2025.11209.11459 443 12/9/2025
2025.11209.11422-preview 429 12/9/2025
2025.11207.11553-preview 198 12/7/2025
2025.11204.11448-preview 182 12/4/2025
2025.11130.12248 416 11/30/2025
2025.11130.12134-preview 337 11/30/2025
2025.11130.11725-preview 336 11/30/2025
2025.11130.11553-preview 333 11/30/2025
2025.11130.11515-preview 339 11/30/2025
2025.11130.11420.59-preview 332 11/30/2025
2025.11130.11323.56-preview 244 11/30/2025
2025.11129.10227.14-preview 91 11/29/2025
2025.11120.10114 402 11/20/2025
2025.11119.12324.6-preview 390 11/19/2025
2025.11119.10110 414 11/19/2025
2025.11118.12340.33-preview 392 11/18/2025
2025.11117.12349.4-preview 379 11/17/2025
2025.11117.11937.47-preview 383 11/17/2025
2025.11113.11532.29-preview 281 11/13/2025
2025.11113.10128.57-preview 271 11/13/2025
2025.11110.10306.55-preview 184 11/10/2025
2025.11109.10018.48-preview 90 11/8/2025
2025.11108.10119.29-preview 72 11/8/2025
2025.11106.10037.1-preview 139 11/6/2025
2025.11105.10254.54-preview 140 11/5/2025
2025.11105.10141.16-preview 150 11/5/2025
2025.11104.12308.54-preview 147 11/4/2025
2025.11104.10144.47-preview 141 11/4/2025
2025.11102.12003.8-preview 143 11/2/2025
2025.11102.11228.52-preview 109 11/2/2025
2025.11102.10309.42-preview 94 11/2/2025
2025.11029.11433.38-preview 141 10/29/2025
2025.11029.10201.38-preview 143 10/29/2025
2025.11027.11947.55-preview 139 10/27/2025
2025.11022.12207.12-preview 123 10/22/2025
2025.11019.12053.37-preview 124 10/19/2025
2025.11016.11750.24-preview 122 10/16/2025
2025.11015.10219.44-preview 129 10/15/2025
2025.11014.10245.12-preview 138 10/14/2025
2025.11012.10130.11-preview 72 10/12/2025
2025.11010.10052.52-preview 127 10/9/2025
2025.11001.12118.13-preview 139 10/1/2025
2025.10925.10144.25-preview 148 9/25/2025
2025.10921.11353.29-preview 163 9/21/2025
2025.10913.11841.29-preview 114 9/13/2025
2025.10912.12351.59-preview 70 9/12/2025
2025.10912.10210.52-preview 137 9/12/2025
2025.10911.10131.43-preview 146 9/10/2025
2025.10910.12340.34-preview 141 9/10/2025
2025.10910.11327.15-preview 131 9/10/2025
2025.10910.11206.45-preview 134 9/10/2025
2025.10910.10230.58-preview 132 9/10/2025
2025.10908.12343.47-preview 188 9/8/2025
2025.10904.12337.35-preview 183 9/4/2025
2025.10904.12245.51-preview 184 9/4/2025
2025.10904.11425.5-preview 188 9/4/2025
2025.10904.10323.39-preview 175 9/4/2025
2025.10826.11425.3-preview 248 8/26/2025
2025.10825.12350.9-preview 183 8/25/2025
2025.10810.10248-preview 159 8/10/2025
2025.10809.10146.35-preview 173 8/9/2025
2025.10806.12031.49-preview 258 8/6/2025
2025.10806.11955.54-preview 261 8/6/2025
2025.10806.11433.24-preview 256 8/6/2025
2025.10709.10105.39-preview 183 7/8/2025
2025.10707.12320.3-preview 188 7/7/2025
2025.10706.11957.9-preview 180 7/6/2025
2025.10702.11752.47-preview 179 7/2/2025
2025.10702.11256.17-preview 179 7/2/2025
2025.10702.11119.10-preview 172 7/2/2025
2025.10702.10000.31-preview 175 7/1/2025
2025.10701.11524.1-preview 176 7/1/2025
2025.10701.11310.13-preview 172 7/1/2025
2025.10630.12022.58-preview 183 6/30/2025
2025.10612.12134.8-preview 339 6/12/2025
2025.10611.12313.53-preview 317 6/11/2025
2025.10603.10159.54-preview 202 6/3/2025
2025.10602.11908.9-preview 203 6/2/2025
2025.10601.10124.29-preview 158 5/31/2025
2025.10531.12235.29-preview 139 5/31/2025
2025.10530.10121.50-preview 192 5/29/2025
2025.10527.12202.4-preview 206 5/27/2025
2025.10526.12034.25-preview 181 5/26/2025
2025.10521.11828.30-preview 198 5/21/2025
2025.10520.11715.6-preview 203 5/20/2025
2025.10520.11515.16-preview 191 5/20/2025
2025.10518.12303.43-preview 180 5/18/2025
2025.10518.11257.36-preview 215 5/18/2025
2025.10517.12347.27-preview 151 5/17/2025
2025.10517.12003.6-preview 131 5/17/2025
2025.10516.11720.13-preview 237 5/16/2025
2025.10514.12334.2-preview 253 5/14/2025
2025.10514.10015.27-preview 265 5/13/2025
2025.10511.11032.32-preview 202 5/11/2025
2025.10413.11530 257 4/13/2025
2025.10413.11434.33-preview 244 4/13/2025
2025.10413.10205.50-preview 184 4/13/2025
2025.10412.11526.4-preview 151 4/12/2025
2025.10412.10141 165 4/12/2025
2025.10411.11811.23-preview 179 4/11/2025
2025.10411.11645.1-preview 173 4/11/2025
2025.10410.11458.35-preview 228 4/10/2025
2025.10405.10143.28-preview 159 4/5/2025
2025.10403.12208.1-preview 234 4/3/2025
2025.10403.11954.16-preview 214 4/3/2025
2025.10401.11908.24-preview 212 4/1/2025
2025.10401.11559.45-preview 208 4/1/2025
2025.10331.12215.59-preview 189 3/31/2025
2025.10331.12130.34-preview 209 3/31/2025
2025.10331.10056.40-preview 178 3/30/2025
2025.10328.10150.21-preview 196 3/28/2025
2025.10323.11359-preview 318 3/23/2025
2025.10320.11800 204 3/20/2025
2025.10320.11616.45-preview 194 3/20/2025
2025.10320.10000 192 3/19/2025
2025.10319.12311.26-preview 210 3/19/2025
2025.10319.12238.6-preview 201 3/19/2025
2025.10319.12057.59-preview 210 3/19/2025
2025.10318.10055 207 3/18/2025
2025.10317.11728.13-preview 187 3/17/2025
2025.10317.11201.3-preview 202 3/17/2025
2025.10315.11523.14-preview 115 3/15/2025
2025.10305.12342 313 3/5/2025
2025.10305.12321.9-preview 242 3/5/2025
2025.10301.12313 201 3/1/2025
2025.10301.12129.38-preview 180 3/1/2025
2025.10221.10043.29-preview 167 2/21/2025
2025.1051.1246 159 2/20/2025
2025.1051.44.54-preview 168 2/20/2025
2025.1044.1 186 2/13/2025
2025.1044.0.2-preview 152 2/13/2025
2025.1043.0.2-preview 161 2/12/2025
2025.1041.0.1-preview 130 2/10/2025
2025.1038.1 192 2/7/2025
2025.1038.0.1-preview 148 2/7/2025
2025.1035.1 170 2/4/2025
2025.1035.0.1-preview 142 2/4/2025
2025.1034.1 166 2/3/2025
2025.1034.0.1-preview 142 2/3/2025
2025.1033.0.5-preview 153 2/2/2025
2025.1033.0.3-preview 145 2/2/2025
2025.1033.0.2-preview 153 2/2/2025
2025.1033.0.1-preview 135 2/2/2025
2025.1025.1 184 1/25/2025
2025.1025.0.1-preview 153 1/25/2025
2025.1021.1 195 1/21/2025
2025.1021.0.1-preview 141 1/21/2025
2025.1020.1 178 1/20/2025
2025.1020.0.3-preview 166 1/20/2025
2025.1020.0.1-preview 163 1/20/2025
2025.1018.0.7-preview 154 1/18/2025
2025.1018.0.5-preview 147 1/18/2025
2025.1018.0.4-preview 126 1/18/2025
2025.1017.0.2-preview 158 1/17/2025
2025.1017.0.1-preview 144 1/17/2025
2025.1016.0.1-preview 122 1/16/2025
2025.1010.1 176 1/10/2025
2025.1010.0.1-preview 127 1/9/2025
2025.1009.0.3-preview 129 1/9/2025
2025.1007.1 174 1/7/2025
2025.1007.0.5-preview 129 1/7/2025
2025.1007.0.3-preview 129 1/7/2025
2025.1006.1 182 1/7/2025
2025.1005.1 187 1/5/2025
2025.1005.0.2-preview 156 1/5/2025
2025.1004.1 190 1/4/2025
2024.1366.1 157 12/31/2024
2024.1366.0.2-preview 159 12/31/2024
2024.1366.0.1-preview 167 12/31/2024
2024.1365.0.2-preview 142 12/30/2024
2024.1365.0.1-preview 153 12/30/2024
2024.1361.0.2-preview 160 12/26/2024
2024.1353.0.1-preview 148 12/18/2024
2024.1352.0.3-preview 157 12/17/2024
2024.1352.0.2-preview 162 12/17/2024
2024.1352.0.1-preview 139 12/17/2024
2024.1351.1 203 12/16/2024
2024.1351.0.3-preview 143 12/16/2024
2024.1350.1 188 12/15/2024
2024.1343.1 204 12/8/2024
2024.1339.1 180 12/4/2024
2024.1336.1 220 12/1/2024
2024.1332.1 225 11/27/2024
2024.1330.1 208 11/25/2024
2024.1328.1 215 11/23/2024
2024.1325.1 204 11/20/2024
2024.1323.1 173 11/18/2024
2024.1316.1 122 11/11/2024
2024.1307.1 111 11/2/2024
2024.1300.1 118 10/26/2024
2024.1294.1 164 10/20/2024
2024.1290.1 224 10/16/2024
2024.1283.1 199 10/8/2024
2024.1282.1 174 10/8/2024
2024.1278.1 195 10/4/2024
2024.1277.1 165 10/3/2024
2024.1275.2 208 10/1/2024
2024.1275.1 173 10/1/2024
2024.1274.1 158 9/30/2024
2024.1263.1 163 9/19/2024
2024.1261.1 230 9/17/2024
2024.1258.1 182 9/13/2024
2024.1257.1 162 9/13/2024
2024.1256.1 190 9/12/2024
2024.1254.1 173 9/10/2024
2024.1250.1 225 9/6/2024
2024.1249.1 211 9/5/2024
2024.1246.1 221 9/2/2024
2024.1245.1 195 9/1/2024
2024.1237.1 218 8/24/2024
2024.1235.0.1-preview 186 8/23/2024
2024.1230.1 195 8/18/2024
2024.1229.1 206 8/16/2024
2024.1228.1 208 8/15/2024
2024.1222.1 252 8/8/2024
2024.1221.1 184 8/7/2024
2024.1221.0.2-preview 136 8/8/2024
2024.1221.0.1-preview 158 8/8/2024
2024.1220.1 158 8/7/2024
2024.1219.0.2-preview 146 8/6/2024
2024.1219.0.1-preview 145 8/6/2024
2024.1217.0.2-preview 127 8/4/2024
2024.1217.0.1-preview 124 8/4/2024
2024.1216.0.2-preview 155 8/3/2024
2024.1216.0.1-preview 109 8/3/2024
2024.1208.0.1-preview 150 7/26/2024
2024.1207.0.7-preview 149 7/25/2024
2024.1207.0.5-preview 147 7/25/2024
2024.1166.1 237 6/14/2024
2024.1165.1 195 6/13/2024
2024.1164.1 184 6/12/2024
2024.1162.1 198 6/10/2024
2024.1158.1 221 6/6/2024
2024.1156.1 181 6/4/2024
2024.1152.1 286 5/31/2024
2024.1151.1 221 5/29/2024
2024.1150.2 193 5/29/2024
2024.1150.1 195 5/29/2024
2024.1149.1 202 5/28/2024
2024.1147.1 211 5/26/2024
2024.1146.2 180 5/25/2024
2024.1146.1 210 5/25/2024
2024.1145.1 201 5/24/2024
2024.1135.2 206 5/14/2024
2024.1135.1 189 5/14/2024
2024.1134.1 195 5/13/2024
2024.1130.1 213 5/9/2024
2024.1123.1 193 5/2/2024
2024.1121.1 216 4/30/2024
2024.1114.1 209 4/22/2024
2024.1113.0.5-preview 185 4/22/2024
2024.1113.0.3-preview 158 4/22/2024
2024.1113.0.2-preview 180 4/22/2024
2024.1113.0.1-preview 173 4/22/2024
2024.1108.0.1-preview 148 4/17/2024
2024.1107.0.1-preview 150 4/16/2024
2024.1094.2 216 4/3/2024
2024.1094.1 183 4/3/2024
2024.1092.1 191 4/1/2024
2024.1088.1 180 3/28/2024
2024.1085.1 159 3/25/2024
2024.1080.2 167 3/20/2024
2024.1080.1 227 3/20/2024
2024.1078.1 198 3/18/2024
2024.1077.1 187 3/17/2024
2024.1073.1 227 3/13/2024
2024.1070.1 229 3/10/2024
2024.1069.1 221 3/9/2024
2024.1068.1 200 3/8/2024
2024.1066.2 197 3/6/2024
2024.1066.1 180 3/6/2024
2024.1065.1 227 3/5/2024
2024.1065.0.1-preview 157 3/5/2024
2024.1063.2 197 3/3/2024
2024.1063.1 194 3/3/2024
2024.1062.1 201 3/2/2024
2024.1061.2 197 3/1/2024
2024.1061.1 198 3/1/2024
2024.1060.2 199 2/29/2024
2024.1060.1 188 2/29/2024
2024.1060.0.5-preview 155 2/29/2024
2024.1060.0.3-preview 184 2/29/2024
2024.1059.0.1-preview 146 2/28/2024
2024.1058.1 207 2/27/2024
2024.1056.1 193 2/25/2024
2024.1055.1 190 2/24/2024
2024.1052.1 194 2/21/2024
2024.1050.2 179 2/20/2024
2024.1050.1 212 2/19/2024
2024.1049.1 207 2/18/2024
2024.1048.1 194 2/17/2024
2024.1047.1 221 2/16/2024
2024.1035.1 217 2/4/2024
2024.1034.2 205 2/3/2024
2024.1029.1 176 1/29/2024
2024.1023.1 249 1/23/2024
2024.1022.1 208 1/22/2024
2024.1020.1 163 1/20/2024
2024.1019.1 189 1/19/2024
2024.1017.1 198 1/17/2024
2024.1012.1 203 1/12/2024
2024.1010.1 219 1/10/2024
2024.1008.1 196 1/8/2024
2024.1007.1 190 1/7/2024
2024.1005.1 230 1/5/2024
2024.1004.1 215 1/4/2024
2023.1365.1 201 12/31/2023
2023.1362.1 192 12/28/2023
2023.1361.1 215 12/27/2023
2023.1359.1 179 12/25/2023
2023.1358.1 232 12/24/2023
2023.1357.1 199 12/23/2023
2023.1342.1 224 12/8/2023
2023.1336.1 237 12/2/2023
2023.1332.1 213 11/28/2023
2023.1330.1 229 11/26/2023
2023.1325.1 212 11/21/2023
2023.1323.1 208 11/19/2023
2023.1320.1 228 11/17/2023
2023.1318.1 205 11/15/2023
2023.1317.1 132 11/13/2023
2023.1307.1 148 11/3/2023
2023.1305.1 162 11/1/2023
2023.1304.1 141 10/31/2023
2023.1294.1 156 10/21/2023
2023.1290.1 158 10/16/2023
2023.1289.1 177 10/16/2023
2023.1284.1 186 10/11/2023
2023.1276.1 144 10/3/2023
2023.1275.1 164 10/2/2023
2023.1272.1 167 9/29/2023
2023.1269.1 126 9/26/2023
2023.1242.1 253 8/30/2023
2023.1231.1 268 8/19/2023
2023.1229.1 258 8/17/2023
2023.1228.1 237 8/16/2023
2023.1227.1 257 8/15/2023
2023.1224.2 272 8/12/2023
2023.1224.1 269 8/12/2023
2023.1213.2 277 8/1/2023
2023.1213.1 260 8/1/2023
2023.1209.1 290 7/27/2023
2023.1201.1 293 7/20/2023
2023.1197.1 275 7/16/2023
2023.1178.1 294 6/27/2023
2023.1175.1 289 6/24/2023
2023.1174.1 302 6/22/2023
2023.1169.1 261 6/18/2023
2023.1165.1 294 6/14/2023
2023.1161.1 296 6/11/2023
2023.1159.1 329 6/7/2023
2023.1157.1 315 6/6/2023
2023.1146.1 328 5/27/2023
2023.1139.1 377 5/19/2023
2023.1137.1 360 5/17/2023
2023.1136.1 341 5/16/2023
2023.1118.1 363 4/28/2023
2023.1111.1 389 4/21/2023
2023.1110.1 369 4/20/2023
2023.1105.1 372 4/15/2023
2023.1103.1 349 4/13/2023
2023.1102.1 392 4/12/2023
2023.1101.1 379 4/11/2023
2023.1090.1 401 3/31/2023
2023.1089.1 410 3/30/2023
2023.1088.1 428 3/29/2023
2023.1082.1 412 3/23/2023
2023.1078.1 412 3/19/2023
2023.1075.1 405 3/16/2023
2023.1070.1 415 3/11/2023
2023.1069.1 439 3/10/2023
2023.1064.1 411 3/5/2023
2023.1060.1 438 3/1/2023
2023.1057.1 423 2/26/2023
2023.1046.1 446 2/15/2023
2023.1043.2 474 2/12/2023
2023.1043.1 477 2/12/2023
2023.1042.1 448 2/11/2023
2023.1041.1 454 2/10/2023
2023.1039.1 489 2/8/2023
2023.1036.1 463 2/5/2023
2023.1035.1 462 2/4/2023
2023.1033.1 460 2/2/2023
2023.1030.1 451 1/30/2023
2023.1028.1 490 1/28/2023
2023.1026.1 490 1/26/2023
2023.1025.1 488 1/25/2023
2023.1024.1 482 1/24/2023
2023.1023.1 484 1/23/2023
2022.1319.1 581 11/15/2022
2022.1309.1 600 11/5/2022
2022.1307.1 542 11/3/2022
2022.1295.1 624 10/22/2022
2022.1290.1 629 10/17/2022
2022.1289.2 610 10/16/2022
2022.1289.1 592 10/16/2022
2022.1283.1 660 10/10/2022
2022.1282.1 615 10/9/2022
2022.1278.1 601 10/5/2022
2022.1272.2 651 9/29/2022
2022.1272.1 581 9/29/2022
2022.1271.1 630 9/28/2022
2022.1266.1 654 9/23/2022
2022.1259.1 653 9/16/2022
2022.1257.1 672 9/14/2022
2022.1250.1 625 9/7/2022
2022.1250.0.2-preview 263 9/7/2022
2022.1249.0.2-preview 291 9/6/2022
2022.1249.0.1-preview 305 9/6/2022
2022.1197.1 664 7/16/2022
2022.1196.1 657 7/15/2022
2022.1194.1 674 7/13/2022
2022.1182.1 667 7/1/2022
2022.1178.1 668 6/27/2022
2022.1166.1 676 6/15/2022
2022.1157.1 719 6/6/2022
2022.1150.1 691 5/30/2022
2022.1149.1 691 5/29/2022
2022.1144.1 696 5/24/2022
0.6.2 691 5/23/2022
0.6.1 643 5/23/2022
0.6.0 650 5/14/2022
0.5.3 740 5/8/2022
0.5.2 796 5/1/2022
0.5.1 664 5/1/2022
0.5.0 693 4/23/2022
0.4.1 695 4/15/2022
0.4.0 683 4/9/2022
0.3.3 680 4/8/2022
0.3.2 630 4/1/2022
0.3.1 658 3/29/2022
0.3.0 740 3/28/2022
0.2.3 697 3/28/2022
0.2.2 660 3/25/2022
0.2.1 704 3/21/2022
0.2.0 707 3/18/2022