EF 6 新特性三
介绍
接下来我将给大家重点介绍一下.Net 6 之后的一些新的变更,文章都是来自于外国大佬的文章,我这边进行一个翻译,并加上一些自己的理解和解释。
源作者链接:https://blog.okyrylchuk.dev/entity-framework-core-6-features-part-1#heading-1-unicode-attribute
正文
EF Core 中的最小 API
EF Core 6.0 拥有自己的最小 API。新的扩展方法注册 DbContext 类型并在一行中提供数据库提供程序的配置。
const string AccountKey = "[CosmosKey]";
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSqlServer<MyDbContext>(@"Server = (localdb)\mssqllocaldb; Database = MyDatabase");
// OR
builder.Services.AddSqlite<MyDbContext>("Data Source=mydatabase.db");
// OR
builder.Services.AddCosmos<MyDbContext>($"AccountEndpoint=https://localhost:8081/;AccountKey={AccountKey}", "MyDatabase");
var app = builder.Build();
app.Run();
class MyDbContext : DbContext
{ }
迁移包
EF Core 6.0 中新的 DevOps 友好功能 - 迁移包。它允许创建一个包含迁移的小型可执行文件。您可以在 CD 中使用它。它不需要您复制源代码或安装 .NET SDK(仅运行时)。
命令行:
dotnet ef migrations bundle --project MigrationBundles
包管理器控制台:
Bundle-Migration
Pre-convention Model Configuration
EF Core 6.0 引入了约定前的模型配置。它允许您为给定类型指定一次映射配置。例如,在使用值对象时,它可能会有所帮助。
public class ExampleContext : DbContext
{
public DbSet<Person> People { get; set; }
public DbSet<Product> Products { get; set; }
protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder)
{
configurationBuilder
.Properties<string>()
.HaveMaxLength(500);
configurationBuilder
.Properties<DateTime>()
.HaveConversion<long>();
configurationBuilder
.Properties<decimal>()
.HavePrecision(12, 2);
configurationBuilder
.Properties<Address>()
.HaveConversion<AddressConverter>();
}
}
public class Product
{
public int Id { get; set; }
public decimal Price { get; set; }
}
public class Person
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime BirthDate { get; set; }
public Address Address { get; set; }
}
public class Address
{
public string Country { get; set; }
public string Street { get; set; }
public string ZipCode { get; set; }
}
public class AddressConverter : ValueConverter<Address, string>
{
public AddressConverter()
: base(
v => JsonSerializer.Serialize(v, (JsonSerializerOptions)null),
v => JsonSerializer.Deserialize<Address>(v, (JsonSerializerOptions)null))
{
}
}
编译模型
在 EF Core 6.0 中,您可以生成已编译的模型。当您有一个大型模型并且您的 EF Core 启动速度很慢时,该功能才有意义。您可以使用 CLI 或包管理器控制台来执行此操作。
public class ExampleContext : DbContext
{
public DbSet<Person> People { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder options)
{
options.UseModel(CompiledModelsExample.ExampleContextModel.Instance)
options.UseSqlServer("Server=(localdb)\\mssqllocaldb;Database=SparseColumns;Trusted_Connection=True;");
}
}
public class Person
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
命令行:
包管理器控制台:
包管理器控制台:
Optimize-DbContext -Context ExampleContext -OutputDir CompiledModels -Namespace CompiledModelsExample
结语
联系作者:加群:867095512 @MrChuJiu