Anduin Xue
Anduin Xue

Anduin's Tech Blog

Entity Framework


Creating a Model for an existing database in Entity Framework Core (DB First)

本文详细介绍了如何在Entity Framework Core中为现有数据库(如SQL Server和MySQL)创建模型(数据库优先)。首先,安装EF(dotnet-ef)工具和相关依赖项。然后,为现有的SQL Server数据库创建一个干净的.NET项目,并使用`dotnet ef dbcontext scaffold`命令反向生成数据库的模型。在命令中,需要填写正确的数据库连接字符串。此外,还可以通过参数`-t TableNameOrViewName`来只反向生成特定表或视图的模型。 对于现有的MySQL数据库,操作步骤类似,可以参考MySQL官方文档中的示例。需要注意的是,使用MySQL时务必使用.NET 5.0,否则可能会出现问题。在完成反向生成后,可以根据需要升级项目。 请注意,在创建模型后,每次更改模型时都需要使用迁移命令来保持数据库与模型的同步。本文提供的方法和示例能帮助你快速地为现有数据库创建模型,从而更好地利用Entity Framework Core进行数据操作。那么,你是否已经准备好尝试这些方法来为你的数据库项目创建模型呢?--GPT 4

C# Entity Framework SQL Server Database Entity Framework Core LINQ

Sync data to database with Entity-Framework Core

本篇博客介绍了如何使用Entity-Framework Core同步数据到数据库。通常,我们可以简单地使用`_dbContext.MyDbSet.Add(myObject)`将数据添加到数据库。但在某些情况下,数据库中可能已经存在一些数据,我们需要删除过时的数据并尝试添加缺失的数据。 文章通过一个具体的例子展示了如何实现数据同步:假设我们有一组数字`1, 1, 2, 2, 3, 3`,而数据库中的数据为`1, 1, 1, 5`。我们需要将数据库中的数据更新为我们期望的数据,即删除第一个`1`和`5`,然后插入`2, 2, 3, 3`。这个过程被称为`DbSet.Sync()`。 首先,我们需要在内存中声明我们需要的数据源模型,然后声明一个新的接口`ISyncable<T>`,并实现该接口。这样可以使数据库源可以映射到实体。接下来,我们需要编写一些扩展方法,允许同步数据。具体实现过程可以参考博客中的示例代码。 最后,在完成上述步骤后,你可以简单地同步你的数据。例如,我们可以使用以下代码将数据同步到数据库: ```csharp var targetCollection = (new int[] { 1, 1, 2, 2, 3, 3 }) // The data you want to sync to database. .Select(t => new MyDataSourceNumber { ValueInMemory = t }) .ToArray(); _dbContext.Numbers.Sync(targetCollection); await _dbContext.SaveChangesAsync(); ``` 使用`Sync`方法,你无需关心具体的过程。它会自动删除过时的数据,并将数据库中的数据更新为你输入的数据,从而实现最小化的数据变更。例如,如果你现有的数据是`2, 3, 4`,它将删除数据`4`并将`1, 1, 2, 3`插入到数据库中。 那么,如何确保我们的数据同步过程更加高效和准确呢?在实际应用中,我们可能需要考虑更多的因素和场景,以满足不同的需求。--GPT 4

C# Entity Framework Database Data Sync

Tips to get better performance for Entity Framework Core

在这篇博客中,我们将探讨如何优化Entity Framework Core的性能。首先,当构建查询时,如果不需要查询中的所有内容,请使用IQueryable编写代码。如果查询已经构建完毕,且所有查询内容都是必要的,请立即将其转换为列表以避免进一步的IO操作。其次,当查询主键时,使用FirstOrDefault替换SingleOrDefault。由于SingleOrDefaultAsync会转换为“top 2”,而FirstOrDefaultAsync会转换为“top 1”,在主键查询中使用FirstOrDefault可以提高性能。 此外,如果不需要保存更改,请考虑添加AsNoTracking以提高查询性能。同时,尽量避免使用Include,因为它会生成复杂的SQL查询。只选择所需的数据,避免编写Include函数。当使用Select时,也可以省略.Include,因为它在这里不会产生任何效果。 最后,避免客户端评估,因为它会使EF从数据库查询所有数据,速度较慢。例如,在处理DateTime或TimeSpan的复杂计算时,先在代码中计算时间,然后构建查询。遵循这些建议,可以有效地提高Entity Framework Core的性能。 在优化Entity Framework Core性能的过程中,你是否遇到过其他问题?尝试过哪些方法来提高查询性能?请在阅读全文后与我们分享您的经验和看法。--GPT 4

Entity Framework SQL Performance Database

Soft deletion in Entity Framework Core

In this blog post, we explore the implementation of soft deletion in Entity Framework Core, a useful feature for cases where data needs a second step before being permanently deleted from the database. By marking data as "Deleted" rather than removing it completely, we can maintain a record of deleted items for further review or processing. We begin by creating an example entity, `Post`, with properties such as `PostId`, `Title`, `Content`, and `IsDeleted`. The `IsDeleted` property indicates whether an item is considered deleted or not. Deleted items will not be selected by default, but can still be accessed using manual SQL queries. Next, we create a `BloggingContext` class that inherits from `DbContext` and contains a `DbSet<Post>` property. We override the `OnConfiguring` method to configure the SQL Server connection, and the `OnModelCreating` method to add a filter that selects only non-deleted posts. To implement soft deletion, we override the `SaveChanges` method in our `Bl...--GPT 4

C# Entity Framework SQL Server Soft deletion

Support multi-tenant in pure Entity Framework Core

In this blog post, we discuss how to support multi-tenancy in pure Entity Framework Core, a crucial feature that allows data to be separated by different tenants, ensuring no interference between them. The post outlines the process of implementing multi-tenancy without relying on ASP.NET boilerplate, focusing on creating an example entity, configuring the SQL Server connection, and adding filters for tenant-specific data. The example entity, Blog, has a primary key, Id, and a TenantId that represents which tenant the blog belongs to. The table is grouped by TenantId, creating multiple collections of blogs. The BloggingContext class is created, taking a tenantId as input, and the SQL Server connection is configured by overriding the OnConfiguring method. To ensure that developers only access blogs from the current tenant, a filter is added by overriding the OnModelCreating method. Additionally, when inserting an item into the table, the TenantId is automatically set by overriding the ...--GPT 4

ASP.NET Core C# Entity Framework Multi-tenant

Auto update database for ASP.NET Core with Entity Framework

在ASP.NET Core项目中,通过Entity Framework连接到数据库时,我们通常需要执行`dotnet ef database update`脚本来更新数据库。然而,这个过程容易被遗忘,导致问题的发生。那么如何在应用程序启动时自动更新数据库呢? 首先,需要了解自动迁移数据库是有风险的,可能导致数据丢失、处理过时的分支以及迁移失败等问题。因此,除非确保一切安全,否则不建议自动更新数据库。 要实现自动更新数据库,需要在项目中添加以下依赖项: <PackageReference Include="Polly" Version="7.2.0" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.0"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> </PackageReference> 借助`Polly`库,可以轻松地重试任务。 接下来,将以下代码复制到项目中: public static IHost MigrateDbContext<TContext>( this IHost host) where TContext : DbContext { // ... } 这段代码为IHost创建了一个扩展方法,允许在应用程序启动后自动升级数据库。它使用应用程序的默认服务提供程序来创建作用域并获取`DBContext`,然后尝试将数据库迁移到最新状态。 如果数据库为空或根本不存在,脚本还可以自动创建数据库。 最后,在启动过程中使用扩展方法,如下所示: public static void Main(string[] args) { CreateHostBuilder(args) .Build() ...--GPT 4

ASP.NET Core C# Entity Framework SQL Server

Consolidate all Entity-Framework database migrations to one migration

本文介绍了如何在不删除任何数据的情况下,整合所有Entity Framework Core代码优先迁移。在代码出错或迁移过多导致编辑器变慢的情况下,可能需要重置所有迁移。但是,直接在代码中删除所有迁移会导致数据库更新失败。因此,本文提供了一个解决方案,分为以下几个步骤: 1. 删除`Migrations`文件夹下的所有`*.cs`文件。 2. 删除数据库中`_EFMIgrationHistory`表中的所有项。 3. 创建一个新的迁移,如:`dotnet ef migrations add Init`。 4. 注释由上一步生成的`20XXXXX_Init.cs`类中的`Up`方法和`Down`方法中的所有内容。 5. 使用当前应用程序的状态更新数据库。此步骤不会更改数据库,而只会在`_EFMigrationHistory`表中创建一个项。这将在数据库中记录一个历史,即`Init`迁移已应用于数据库。 6. 取消注释C#文件中的`Up`和`Down`方法。 7. 如果有版本控制,请检查。 8. 重新运行`dotnet ef database update`。这可能会显示一切都是最新的,这正是我们所期望的。 9. 启动应用程序,应用程序将正常运行。 如果您有其他使用不同数据库的环境,则需要**针对每个数据库**执行以下步骤: 10. 检出步骤7中推送的最新代码。 11. 删除数据库中`_EFMIgrationHistory`表中的所有项。 12. 注释由步骤3生成的`20XXXXX_Init.cs`类中的`Up`方法和`Down`方法中的所有内容。 13. 使用当前应用程序的状态更新数据库。此步骤不会更改数据库,而只会在`_EFMigrationHistory`表中创建一个项。这将在数据库中记录一个历史,即`Init`迁移已应用于数据库。 14. 将代码状态重置为步骤10。例如:`git reset --hard HEAD`。 15. 尝试运行应用程序。 在开始之前,强烈建议您首先备份数据。本文提供的方法仅适用于代码优先的EF Core,并不能确保数据不会丢失。那么,这种方法是否适用于所有场景?是否存在更好的方法来整合迁移?在实践中,您可能需要自己寻找答案。--GPT 4

ASP.NET Core C# .NET Core Entity Framework SQL Server

  • 1