zoukankan      html  css  js  c++  java
  • EFCore-3

    带着问题去思考!大家好

    EF Core常见的任务

    建模数据库,目前EFCore只支持Code First方法。

    1:定义数据库和模型

    数据库最终是按照一个派生自DbContext的类进行建模的,这个类包含一个或多个类型为DbSet<T>的集合属性,T是表中记录的类型,

    public class YourDataBase:DbContext
    {
       public DbSet<Customer> Customers{get;set;}
    }

    底层物理关系数据库需要有一个名为Customers的表。

    public class EntityBase
    {
       public EntityBase()
       {
           Enabled=true;
           Modified=DateTime.UtcNow;
       }
       public bool Enabled{get;set;}
       public DateTime? Modfied{get;set;}
    }
    public class Customer:EntityBase
    {
     [Key]
     public int Id{get;set;}
     public string FirstName{get;set;}
    }

    这里强调下,数据库的模式和映射到类必须始终保持同步,否则,EF Core将抛出异常,这意味即使在表中添加一个新的可空列,也会是一个问题。另一方面,向类添加一个公有属性也可能会出现问题,不过,这种情况下。使用NoMapped特性就不会抛出异常。

    2:注入连接字符串

    这里可以重写DbContext类的OnConfiguring方法,该方法接受一个选项生成器对象,后者为每个原生支持的提供程序都提供一个扩展方法,包括SQL Server.SQLite。

     public class SqlServerDbContext : DbContext, IDisposable
    {
          protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
            {
                optionsBuilder.UseSqlServer(ConnectionString);
            }
    }

    但是实际情况,你需要对不同的环境(生产,开发,暂存等)使用不同的字符串,这种情况,你需要找到一种方式来注入字符串。所以DbContext类中添加一个全局静态属性,

     private static string ConnectionString { get; set; }

    通常从配置文件中读取连接字符串,并在应用程序启动设置它

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
      YourDataBase.ConnectionString=!env.IsDevelopment()?
      "Production connection string":    
      "development connection string":    
    }

    3:注入DbContext对象

    根据隔离关注点所做的话,不建议这种

    在ConfigureServices中

    var connString=Configuration.GetConnectionString("YourDatabase");
    services.AddDbContext<YourDatabase>(option=>option.UserSqlServer(connString));

    4:自动创建数据库

    当数据库还不存在的时候,创建数据库所需的代码与EF6的一些区别。EFCore中,必须显式请求这个步骤。需要自动穿件一个数据库。需要把下面代码放到启动类Configure中

    var db=new YourDatabase();
    db.Database.EnsureCreated():

    如果数据库还不存在。EnsureCreated就会创建数据库,否则跳过。将初始数据加载到数据库的操作也可以在代码中完全控制。

    db.Database.SeedTables();

    在EnsureCreated()之后调用。

    关于处理表数据。这里不在介绍,这很基础。在这里不在赘述,如果你稍微用过EF。

  • 相关阅读:
    一句SQL实现MYSQL的递归查询
    人生不过一个字【Life is but a word】
    VS2008 如何将Release版本设置可以调试的DEBUG版本
    微软 2018 年第一笔收购:文件存储公司 Avere Systems
    设置系统时间
    OpenVZ安装指南,一种操作系统级别的虚拟化技术
    云平台DevOps实践
    路由(Routing)
    Ubuntu命令
    net mvc中angular
  • 原文地址:https://www.cnblogs.com/ccaa/p/12563466.html
Copyright © 2011-2022 走看看