I-Synergy.Framework.EntityFramework 2025.11119.12324.6-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.11119.12324.6-preview
                    
NuGet\Install-Package I-Synergy.Framework.EntityFramework -Version 2025.11119.12324.6-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.11119.12324.6-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.11119.12324.6-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.11119.12324.6-preview
                    
#r "nuget: I-Synergy.Framework.EntityFramework, 2025.11119.12324.6-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.11119.12324.6-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.11119.12324.6-preview&prerelease
                    
Install as a Cake Addin
#tool nuget:?package=I-Synergy.Framework.EntityFramework&version=2025.11119.12324.6-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
2025.11120.10114 339 11/20/2025
2025.11119.12324.6-preview 359 11/19/2025
2025.11119.10110 383 11/19/2025
2025.11118.12340.33-preview 368 11/18/2025
2025.11117.12349.4-preview 366 11/17/2025
2025.11117.11937.47-preview 370 11/17/2025
2025.11113.11532.29-preview 268 11/13/2025
2025.11113.10128.57-preview 260 11/13/2025
2025.11110.10306.55-preview 171 11/10/2025
2025.11109.10018.48-preview 79 11/8/2025
2025.11108.10119.29-preview 55 11/8/2025
2025.11106.10037.1-preview 132 11/6/2025
2025.11105.10254.54-preview 132 11/5/2025
2025.11105.10141.16-preview 136 11/5/2025
2025.11104.12308.54-preview 131 11/4/2025
2025.11104.10144.47-preview 132 11/4/2025
2025.11102.12003.8-preview 134 11/2/2025
2025.11102.11228.52-preview 100 11/2/2025
2025.11102.10309.42-preview 79 11/2/2025
2025.11029.11433.38-preview 132 10/29/2025
2025.11029.10201.38-preview 134 10/29/2025
2025.11027.11947.55-preview 125 10/27/2025
2025.11022.12207.12-preview 117 10/22/2025
2025.11019.12053.37-preview 121 10/19/2025
2025.11016.11750.24-preview 117 10/16/2025
2025.11015.10219.44-preview 121 10/15/2025
2025.11014.10245.12-preview 130 10/14/2025
2025.11012.10130.11-preview 63 10/12/2025
2025.11010.10052.52-preview 120 10/9/2025
2025.11001.12118.13-preview 129 10/1/2025
2025.10925.10144.25-preview 136 9/25/2025
2025.10921.11353.29-preview 156 9/21/2025
2025.10913.11841.29-preview 110 9/13/2025
2025.10912.12351.59-preview 62 9/12/2025
2025.10912.10210.52-preview 130 9/12/2025
2025.10911.10131.43-preview 135 9/10/2025
2025.10910.12340.34-preview 135 9/10/2025
2025.10910.11327.15-preview 123 9/10/2025
2025.10910.11206.45-preview 123 9/10/2025
2025.10910.10230.58-preview 125 9/10/2025
2025.10908.12343.47-preview 178 9/8/2025
2025.10904.12337.35-preview 175 9/4/2025
2025.10904.12245.51-preview 177 9/4/2025
2025.10904.11425.5-preview 180 9/4/2025
2025.10904.10323.39-preview 172 9/4/2025
2025.10826.11425.3-preview 240 8/26/2025
2025.10825.12350.9-preview 176 8/25/2025
2025.10810.10248-preview 150 8/10/2025
2025.10809.10146.35-preview 162 8/9/2025
2025.10806.12031.49-preview 248 8/6/2025
2025.10806.11955.54-preview 255 8/6/2025
2025.10806.11433.24-preview 246 8/6/2025
2025.10709.10105.39-preview 177 7/8/2025
2025.10707.12320.3-preview 182 7/7/2025
2025.10706.11957.9-preview 170 7/6/2025
2025.10702.11752.47-preview 170 7/2/2025
2025.10702.11256.17-preview 174 7/2/2025
2025.10702.11119.10-preview 165 7/2/2025
2025.10702.10000.31-preview 169 7/1/2025
2025.10701.11524.1-preview 167 7/1/2025
2025.10701.11310.13-preview 165 7/1/2025
2025.10630.12022.58-preview 173 6/30/2025
2025.10612.12134.8-preview 334 6/12/2025
2025.10611.12313.53-preview 309 6/11/2025
2025.10603.10159.54-preview 189 6/3/2025
2025.10602.11908.9-preview 189 6/2/2025
2025.10601.10124.29-preview 145 5/31/2025
2025.10531.12235.29-preview 130 5/31/2025
2025.10530.10121.50-preview 185 5/29/2025
2025.10527.12202.4-preview 194 5/27/2025
2025.10526.12034.25-preview 172 5/26/2025
2025.10521.11828.30-preview 192 5/21/2025
2025.10520.11715.6-preview 199 5/20/2025
2025.10520.11515.16-preview 176 5/20/2025
2025.10518.12303.43-preview 167 5/18/2025
2025.10518.11257.36-preview 207 5/18/2025
2025.10517.12347.27-preview 138 5/17/2025
2025.10517.12003.6-preview 122 5/17/2025
2025.10516.11720.13-preview 229 5/16/2025
2025.10514.12334.2-preview 239 5/14/2025
2025.10514.10015.27-preview 255 5/13/2025
2025.10511.11032.32-preview 192 5/11/2025
2025.10413.11530 247 4/13/2025
2025.10413.11434.33-preview 235 4/13/2025
2025.10413.10205.50-preview 176 4/13/2025
2025.10412.11526.4-preview 140 4/12/2025
2025.10412.10141 152 4/12/2025
2025.10411.11811.23-preview 175 4/11/2025
2025.10411.11645.1-preview 167 4/11/2025
2025.10410.11458.35-preview 221 4/10/2025
2025.10405.10143.28-preview 147 4/5/2025
2025.10403.12208.1-preview 225 4/3/2025
2025.10403.11954.16-preview 205 4/3/2025
2025.10401.11908.24-preview 206 4/1/2025
2025.10401.11559.45-preview 201 4/1/2025
2025.10331.12215.59-preview 181 3/31/2025
2025.10331.12130.34-preview 203 3/31/2025
2025.10331.10056.40-preview 174 3/30/2025
2025.10328.10150.21-preview 188 3/28/2025
2025.10323.11359-preview 307 3/23/2025
2025.10320.11800 191 3/20/2025
2025.10320.11616.45-preview 181 3/20/2025
2025.10320.10000 183 3/19/2025
2025.10319.12311.26-preview 202 3/19/2025
2025.10319.12238.6-preview 195 3/19/2025
2025.10319.12057.59-preview 201 3/19/2025
2025.10318.10055 197 3/18/2025
2025.10317.11728.13-preview 179 3/17/2025
2025.10317.11201.3-preview 193 3/17/2025
2025.10315.11523.14-preview 105 3/15/2025
2025.10305.12342 303 3/5/2025
2025.10305.12321.9-preview 239 3/5/2025
2025.10301.12313 188 3/1/2025
2025.10301.12129.38-preview 166 3/1/2025
2025.10221.10043.29-preview 163 2/21/2025
2025.1051.1246 143 2/20/2025
2025.1051.44.54-preview 156 2/20/2025
2025.1044.1 175 2/13/2025
2025.1044.0.2-preview 145 2/13/2025
2025.1043.0.2-preview 152 2/12/2025
2025.1041.0.1-preview 127 2/10/2025
2025.1038.1 180 2/7/2025
2025.1038.0.1-preview 140 2/7/2025
2025.1035.1 159 2/4/2025
2025.1035.0.1-preview 134 2/4/2025
2025.1034.1 154 2/3/2025
2025.1034.0.1-preview 135 2/3/2025
2025.1033.0.5-preview 141 2/2/2025
2025.1033.0.3-preview 135 2/2/2025
2025.1033.0.2-preview 143 2/2/2025
2025.1033.0.1-preview 128 2/2/2025
2025.1025.1 171 1/25/2025
2025.1025.0.1-preview 145 1/25/2025
2025.1021.1 182 1/21/2025
2025.1021.0.1-preview 127 1/21/2025
2025.1020.1 164 1/20/2025
2025.1020.0.3-preview 159 1/20/2025
2025.1020.0.1-preview 156 1/20/2025
2025.1018.0.7-preview 146 1/18/2025
2025.1018.0.5-preview 133 1/18/2025
2025.1018.0.4-preview 121 1/18/2025
2025.1017.0.2-preview 150 1/17/2025
2025.1017.0.1-preview 138 1/17/2025
2025.1016.0.1-preview 114 1/16/2025
2025.1010.1 161 1/10/2025
2025.1010.0.1-preview 118 1/9/2025
2025.1009.0.3-preview 119 1/9/2025
2025.1007.1 158 1/7/2025
2025.1007.0.5-preview 119 1/7/2025
2025.1007.0.3-preview 116 1/7/2025
2025.1006.1 170 1/7/2025
2025.1005.1 175 1/5/2025
2025.1005.0.2-preview 145 1/5/2025
2025.1004.1 178 1/4/2025
2024.1366.1 143 12/31/2024
2024.1366.0.2-preview 151 12/31/2024
2024.1366.0.1-preview 162 12/31/2024
2024.1365.0.2-preview 132 12/30/2024
2024.1365.0.1-preview 143 12/30/2024
2024.1361.0.2-preview 150 12/26/2024
2024.1353.0.1-preview 137 12/18/2024
2024.1352.0.3-preview 147 12/17/2024
2024.1352.0.2-preview 157 12/17/2024
2024.1352.0.1-preview 133 12/17/2024
2024.1351.1 191 12/16/2024
2024.1351.0.3-preview 133 12/16/2024
2024.1350.1 179 12/15/2024
2024.1343.1 192 12/8/2024
2024.1339.1 169 12/4/2024
2024.1336.1 211 12/1/2024
2024.1332.1 211 11/27/2024
2024.1330.1 200 11/25/2024
2024.1328.1 205 11/23/2024
2024.1325.1 192 11/20/2024
2024.1323.1 163 11/18/2024
2024.1316.1 110 11/11/2024
2024.1307.1 102 11/2/2024
2024.1300.1 104 10/26/2024
2024.1294.1 151 10/20/2024
2024.1290.1 213 10/16/2024
2024.1283.1 188 10/8/2024
2024.1282.1 162 10/8/2024
2024.1278.1 181 10/4/2024
2024.1277.1 153 10/3/2024
2024.1275.2 197 10/1/2024
2024.1275.1 156 10/1/2024
2024.1274.1 147 9/30/2024
2024.1263.1 154 9/19/2024
2024.1261.1 218 9/17/2024
2024.1258.1 171 9/13/2024
2024.1257.1 152 9/13/2024
2024.1256.1 180 9/12/2024
2024.1254.1 164 9/10/2024
2024.1250.1 216 9/6/2024
2024.1249.1 196 9/5/2024
2024.1246.1 209 9/2/2024
2024.1245.1 185 9/1/2024
2024.1237.1 214 8/24/2024
2024.1235.0.1-preview 180 8/23/2024
2024.1230.1 180 8/18/2024
2024.1229.1 196 8/16/2024
2024.1228.1 202 8/15/2024
2024.1222.1 245 8/8/2024
2024.1221.1 172 8/7/2024
2024.1221.0.2-preview 130 8/8/2024
2024.1221.0.1-preview 150 8/8/2024
2024.1220.1 151 8/7/2024
2024.1219.0.2-preview 138 8/6/2024
2024.1219.0.1-preview 138 8/6/2024
2024.1217.0.2-preview 120 8/4/2024
2024.1217.0.1-preview 115 8/4/2024
2024.1216.0.2-preview 149 8/3/2024
2024.1216.0.1-preview 101 8/3/2024
2024.1208.0.1-preview 146 7/26/2024
2024.1207.0.7-preview 138 7/25/2024
2024.1207.0.5-preview 132 7/25/2024
2024.1166.1 227 6/14/2024
2024.1165.1 185 6/13/2024
2024.1164.1 173 6/12/2024
2024.1162.1 183 6/10/2024
2024.1158.1 209 6/6/2024
2024.1156.1 173 6/4/2024
2024.1152.1 278 5/31/2024
2024.1151.1 210 5/29/2024
2024.1150.2 176 5/29/2024
2024.1150.1 186 5/29/2024
2024.1149.1 192 5/28/2024
2024.1147.1 202 5/26/2024
2024.1146.2 170 5/25/2024
2024.1146.1 202 5/25/2024
2024.1145.1 195 5/24/2024
2024.1135.2 194 5/14/2024
2024.1135.1 180 5/14/2024
2024.1134.1 189 5/13/2024
2024.1130.1 206 5/9/2024
2024.1123.1 173 5/2/2024
2024.1121.1 203 4/30/2024
2024.1114.1 200 4/22/2024
2024.1113.0.5-preview 176 4/22/2024
2024.1113.0.3-preview 147 4/22/2024
2024.1113.0.2-preview 173 4/22/2024
2024.1113.0.1-preview 164 4/22/2024
2024.1108.0.1-preview 145 4/17/2024
2024.1107.0.1-preview 144 4/16/2024
2024.1094.2 203 4/3/2024
2024.1094.1 173 4/3/2024
2024.1092.1 182 4/1/2024
2024.1088.1 172 3/28/2024
2024.1085.1 146 3/25/2024
2024.1080.2 158 3/20/2024
2024.1080.1 215 3/20/2024
2024.1078.1 184 3/18/2024
2024.1077.1 176 3/17/2024
2024.1073.1 214 3/13/2024
2024.1070.1 219 3/10/2024
2024.1069.1 211 3/9/2024
2024.1068.1 191 3/8/2024
2024.1066.2 191 3/6/2024
2024.1066.1 173 3/6/2024
2024.1065.1 217 3/5/2024
2024.1065.0.1-preview 151 3/5/2024
2024.1063.2 185 3/3/2024
2024.1063.1 183 3/3/2024
2024.1062.1 187 3/2/2024
2024.1061.2 187 3/1/2024
2024.1061.1 189 3/1/2024
2024.1060.2 194 2/29/2024
2024.1060.1 176 2/29/2024
2024.1060.0.5-preview 148 2/29/2024
2024.1060.0.3-preview 174 2/29/2024
2024.1059.0.1-preview 135 2/28/2024
2024.1058.1 194 2/27/2024
2024.1056.1 182 2/25/2024
2024.1055.1 179 2/24/2024
2024.1052.1 184 2/21/2024
2024.1050.2 166 2/20/2024
2024.1050.1 198 2/19/2024
2024.1049.1 195 2/18/2024
2024.1048.1 183 2/17/2024
2024.1047.1 212 2/16/2024
2024.1035.1 200 2/4/2024
2024.1034.2 190 2/3/2024
2024.1029.1 165 1/29/2024
2024.1023.1 239 1/23/2024
2024.1022.1 195 1/22/2024
2024.1020.1 155 1/20/2024
2024.1019.1 175 1/19/2024
2024.1017.1 189 1/17/2024
2024.1012.1 195 1/12/2024
2024.1010.1 208 1/10/2024
2024.1008.1 182 1/8/2024
2024.1007.1 179 1/7/2024
2024.1005.1 217 1/5/2024
2024.1004.1 206 1/4/2024
2023.1365.1 188 12/31/2023
2023.1362.1 182 12/28/2023
2023.1361.1 204 12/27/2023
2023.1359.1 171 12/25/2023
2023.1358.1 218 12/24/2023
2023.1357.1 189 12/23/2023
2023.1342.1 217 12/8/2023
2023.1336.1 227 12/2/2023
2023.1332.1 198 11/28/2023
2023.1330.1 214 11/26/2023
2023.1325.1 202 11/21/2023
2023.1323.1 198 11/19/2023
2023.1320.1 216 11/17/2023
2023.1318.1 194 11/15/2023
2023.1317.1 117 11/13/2023
2023.1307.1 142 11/3/2023
2023.1305.1 151 11/1/2023
2023.1304.1 133 10/31/2023
2023.1294.1 148 10/21/2023
2023.1290.1 153 10/16/2023
2023.1289.1 164 10/16/2023
2023.1284.1 176 10/11/2023
2023.1276.1 136 10/3/2023
2023.1275.1 157 10/2/2023
2023.1272.1 162 9/29/2023
2023.1269.1 120 9/26/2023
2023.1242.1 242 8/30/2023
2023.1231.1 257 8/19/2023
2023.1229.1 251 8/17/2023
2023.1228.1 230 8/16/2023
2023.1227.1 252 8/15/2023
2023.1224.2 262 8/12/2023
2023.1224.1 257 8/12/2023
2023.1213.2 267 8/1/2023
2023.1213.1 247 8/1/2023
2023.1209.1 277 7/27/2023
2023.1201.1 273 7/20/2023
2023.1197.1 262 7/16/2023
2023.1178.1 284 6/27/2023
2023.1175.1 279 6/24/2023
2023.1174.1 296 6/22/2023
2023.1169.1 255 6/18/2023
2023.1165.1 284 6/14/2023
2023.1161.1 283 6/11/2023
2023.1159.1 311 6/7/2023
2023.1157.1 303 6/6/2023
2023.1146.1 313 5/27/2023
2023.1139.1 365 5/19/2023
2023.1137.1 346 5/17/2023
2023.1136.1 327 5/16/2023
2023.1118.1 349 4/28/2023
2023.1111.1 373 4/21/2023
2023.1110.1 353 4/20/2023
2023.1105.1 355 4/15/2023
2023.1103.1 335 4/13/2023
2023.1102.1 377 4/12/2023
2023.1101.1 366 4/11/2023
2023.1090.1 383 3/31/2023
2023.1089.1 396 3/30/2023
2023.1088.1 416 3/29/2023
2023.1082.1 394 3/23/2023
2023.1078.1 398 3/19/2023
2023.1075.1 389 3/16/2023
2023.1070.1 403 3/11/2023
2023.1069.1 424 3/10/2023
2023.1064.1 400 3/5/2023
2023.1060.1 418 3/1/2023
2023.1057.1 411 2/26/2023
2023.1046.1 429 2/15/2023
2023.1043.2 459 2/12/2023
2023.1043.1 462 2/12/2023
2023.1042.1 435 2/11/2023
2023.1041.1 439 2/10/2023
2023.1039.1 472 2/8/2023
2023.1036.1 444 2/5/2023
2023.1035.1 445 2/4/2023
2023.1033.1 447 2/2/2023
2023.1030.1 435 1/30/2023
2023.1028.1 476 1/28/2023
2023.1026.1 474 1/26/2023
2023.1025.1 473 1/25/2023
2023.1024.1 466 1/24/2023
2023.1023.1 470 1/23/2023
2022.1319.1 560 11/15/2022
2022.1309.1 583 11/5/2022
2022.1307.1 527 11/3/2022
2022.1295.1 605 10/22/2022
2022.1290.1 610 10/17/2022
2022.1289.2 593 10/16/2022
2022.1289.1 574 10/16/2022
2022.1283.1 641 10/10/2022
2022.1282.1 594 10/9/2022
2022.1278.1 584 10/5/2022
2022.1272.2 630 9/29/2022
2022.1272.1 565 9/29/2022
2022.1271.1 615 9/28/2022
2022.1266.1 635 9/23/2022
2022.1259.1 635 9/16/2022
2022.1257.1 652 9/14/2022
2022.1250.1 604 9/7/2022
2022.1250.0.2-preview 248 9/7/2022
2022.1249.0.2-preview 272 9/6/2022
2022.1249.0.1-preview 287 9/6/2022
2022.1197.1 641 7/16/2022
2022.1196.1 641 7/15/2022
2022.1194.1 655 7/13/2022
2022.1182.1 647 7/1/2022
2022.1178.1 643 6/27/2022
2022.1166.1 657 6/15/2022
2022.1157.1 699 6/6/2022
2022.1150.1 673 5/30/2022
2022.1149.1 675 5/29/2022
2022.1144.1 680 5/24/2022
0.6.2 673 5/23/2022
0.6.1 629 5/23/2022
0.6.0 633 5/14/2022
0.5.3 726 5/8/2022
0.5.2 779 5/1/2022
0.5.1 648 5/1/2022
0.5.0 675 4/23/2022
0.4.1 678 4/15/2022
0.4.0 668 4/9/2022
0.3.3 662 4/8/2022
0.3.2 613 4/1/2022
0.3.1 644 3/29/2022
0.3.0 717 3/28/2022
0.2.3 682 3/28/2022
0.2.2 642 3/25/2022
0.2.1 689 3/21/2022
0.2.0 689 3/18/2022