zoukankan      html  css  js  c++  java
  • Entity Framework学习过程

    ///安装ef  nuget中文控制台指令
    PM> Install-Package EntityFramework.zh-Hans
    <!--配置数据库连接-->  
    <connectionStrings>
        <add name="Conn" connectionString="server=?;uid=?;pwd=?;database=?" providerName="System.Data.SqlClient" />
    </connectionStrings>
    <!--简单的Entity Framework连接教程-->  
    https://blog.csdn.net/qq_33459121/article/details/81559793
    常用命令集合:
    
    1. 【Enable-Migrations】开启数据迁移,开启后项目中会添加【Migrations】文件夹。
    
      相关命令:【Enable-Migrations -EnableAutomaticMigrations 】开启自动数据迁移,不产生代码文件
    
    2. 【Add-Migration <自定义文件名>】生成数据迁移更新文件,如Add-Migration AddPost
    
    3. 【Update-Database】更新数据库结构
    
      相关命令:【Update-Database -Verbose】更新数据库结构,并显示执行的SQL
    
           【Update-Database -TargetMigration <要降级到的文件名>】降级,自定义文件名为Add-Migration时输入的文件名,空数据库文件名为$InitialDatabase,如 Update-Database -TargetMigration AddPost
    
           【Update-Database -Script -SourceMigration: <> -TargetMigration: <目标>】,生成数据库SQL,只生成不执行数据更新,如Update-Database -Script -SourceMigration: $InitialDatabase -TargetMigration: AddPostAbstract
    
           运行 Update-Database 命令,但此时指定 –Script 标记,使更改写入脚本而不应用。我们还将指定为其生成脚本的源和目标迁移。我们希望脚本用于从空数据库 ($InitialDatabase) 最新版本(迁移 AddPostAbstract)的迁移。如果不希望指定目标迁移,迁移将使用最新迁移作为目标。如果未指定源迁移,迁移将使用数据库的当前状态。
    
           【Update-Database -ConnectionString "Server=localhost; Database=MyAbpZeroProject; User=sa; Password=;" -ConnectionProviderName "System.Data.SqlClient" -ProjectName "Abp.Samples.Blog.EntityFramework" -Verbose】指定更新连接
    
    4. 在程序启动时,自动执行更新,不需要人手update-database,在程序启用时添加
    
     Database.SetInitializer(new MigrateDatabaseToLatestVersion<BlogContext, Configuration>()); 
    
     BlogContext为DbContext,Configuration是Migrations文件夹里面的Configuration.cs

    public class SchoolContext : DbContext
    {
    public SchoolContext() : base("SchoolContext")
    {
    // 这是默认的数据库初始化策略。就像它的名称那样,如果根据配置,数据库不存在的话,就会创建数据库。但是如果你改变模型类,使用这个策略,再运行程序的话,就会抛出一个异常。
    //Database.SetInitializer<SchoolContext>(new CreateDatabaseIfNotExists<SchoolContext>());
    // 这个策略会在你的模型发生改变的时候,删除已经存在的数据库,然后创建一个新的数据库。所以当你模型改变的时候,不必担心怎么来维护数据库对象模式。
    //Database.SetInitializer<SchoolContext>(new DropCreateDatabaseIfModelChanges<SchoolContext>());
    // 就像其名称所示,这个策略每次你运行程序的时候,都会删除以及存在的数据库,而不管你的模型类 是否发生改变。这个策略非常有用,当你每次运行程序,都想要一个新的数据库的时候。例如:当你在开发程序的时候。使用这个策略比较好。
    //Database.SetInitializer<SchoolContext>(new DropCreateDatabaseAlways<SchoolContext>());
    // Custom DB Initializer: 如果上面的策略不满足你的需求或者数据库初始化的时候,你想额外做一些其他的处理的时候, 你就可以创建你自己的数据库初始化策略。
    Database.SetInitializer<SchoolContext>(new SchoolInitializer());
    }

    public DbSet<Student> Students { get; set; }
    public DbSet<Enrollment> Enrollments { get; set; }
    public DbSet<Course> Courses { get; set; }
    public DbSet<Department> Department { get; set; }
    public DbSet<School> School { get; set; }
    public DbSet<ClassNo> ClassNo { get; set; }
    public DbSet<SN> SN { get; set; }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
    //防止数据库生成的表是复数形式
    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

    //Database.SetInitializer<SchoolContext>(new SchoolInitializer());
    }

            /// <summary>
            /// 重写ef SaveChanges方法
            /// </summary>
            /// <returns></returns>
            public override int SaveChanges()
            {
                ChangeTracker.DetectChanges(); // Important!
                var modifiedEntities = this.ChangeTracker
                    .Entries()
                    .Where(x => x.State == EntityState.Modified)
                    .Select(x => x.Entity)
                    .ToList();
                foreach (var entity in modifiedEntities)
                {
                    var baseEntity = entity as Entities;
                    if (baseEntity != null)
                    {
                        baseEntity.CreationTime = DateTime.Now;
                    }
                }
                return base.SaveChanges();
            }
    The Entity Framework provider type 'System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer' registered in the application config file for the ADO.NET provider with invariant name
    
    BIN目录下没有生成EntityFramework.SqlServer.dll
    
    解决办法 1查看该dll属性  复制到本地改为true
    解决办法 2 EF6包不仅需要在类库项目安装,还需要在引用该类库的项目中安装.
    可以通过注解或者api的方式为guid类型的数据设置自增长,分别是:
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    this.Property(t => t.Identifier).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);  //Guid类型主键自增长
    //https://www.cnblogs.com/oppoic/p/ef_databasegeneratedoption_timestamp_concurrencycheck_complextype.html
  • 相关阅读:
    tp3.2和tp5的区别
    tp(调试模式,空操作,跨控制器调用,跨方法跳转--redirect(),框架语法,创建model模型)
    tp 连表查 分页 模糊查询
    thinkphp if和eq的区别
    js 面向对象例子
    JS字符串转换为JSON的四种方法笔记
    json在php中的使用之如何转换json为数组
    window.frames用法
    php js 数组排序
    控件常用
  • 原文地址:https://www.cnblogs.com/WeiYongZhi/p/10855719.html
Copyright © 2011-2022 走看看