• 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

    公众号

  • 相关阅读:
    EasyTransaction主要源码分析
    编程哲理小故事:Tina的运动会方阵
    多维扩展点的思考与设计——解决渠道、产品增加引发的腐化问题
    分布式事务框架Seata及EasyTransaction架构的比对思考
    设计,架构,框架之间是什么关系?
    你知道如何画好一幅架构图么?
    学会分享痛苦
    建立你自己的博客
    使用正确的工具软件
    掌握主动权
  • 原文地址:https://www.cnblogs.com/MrChuJiu/p/15820033.html
Copyright © 2020-2023  润新知