zoukankan      html  css  js  c++  java
  • EntityFramewordCore 2.2 DBFirst简单使用

    如何用EF Core连接数据库并且生成实体类?

    1、通过Nuget安装依赖

    Install-package Microsoft.EntityFrameworkCore 
    Install-package Microsoft.EntityFrameworkCore.Tools 
    Install-package Microsoft.EntityFrameworkCore.Design 
    Install-package Microsoft.EntityFrameworkCore.SqlServer 
    Install-package Microsoft.EntityFrameworkCore.SqlServer.Design 

     2、Scaffold-DbContext命令连接数据库

    Scaffold-DbContext -Connection "Server=.;Database=EFCoreDemo;uid=sa;pwd=123" Microsoft.EntityFrameworkCore.SqlServer -OutputDir "Models"

    关于此命令的一些解释,可以参见:

    开源中国: Scaffold-DbContext

    MSDN: Scaffold-DbContext

    要注意的是,如果数据库更新了,想将项目里面映射的model更新,那么可以在上述命令加上"-Force"参数

    这两个步骤之后,就可以像EntityFramword一样操作数据库表了。

    Models.TestDBContext dbContext = new Models.TestDBContext();
    
            [HttpGet]
            public JsonResult GetVoteDetail(int voteID)
            {
                var vote = (from v in dbContext.Vote
                            join s in dbContext.Staff on v.Creator equals s.Id
                            where v.Id == voteID
                            select new { s.NameEnglish, v.Title }).FirstOrDefault();
    
                string ss = vote.NameEnglish;
    return null;
            }

     

    那么,怎么用EF Core操作数据库里面的视图呢?

    EF Core2.2 DBFirst映射出来的实体类只包含了Table,并没有View之类。

    三个步骤:

    1、仿照DB的视图,手动创建一个实体类

    2、修改Scaffold-DbContext命令生成的DbContext文件,增加视图的属性

    3、修改DBContext文件的OnModelCreating方法,添加视图相关内容

    protected override void OnModelCreating(ModelBuilder modelBuilder)
            {
                modelBuilder.HasAnnotation("ProductVersion", "2.2.3-servicing-35854");
    
                modelBuilder.Entity<City>(entity =>
                {
                    entity.Property(e => e.Id).HasColumnName("ID");
    
                    entity.Property(e => e.Address).HasMaxLength(200);
    
                    entity.Property(e => e.AddressChinese).HasMaxLength(200);
    
                    entity.Property(e => e.Name)
                        .IsRequired()
                        .HasMaxLength(30);
    
                    entity.Property(e => e.NameChinese).HasMaxLength(20);
    
                    entity.Property(e => e.Phone).HasMaxLength(20);
                });
    
                。。。。。。。。。。。
    
    //上面都是自动生成的,下面的是要添加的部分代码
    
                //EF core for DB view
                modelBuilder.Query<VoteItemView>(v =>
                {
                    v.ToView("VoteItemView");
                    v.Property(p => p.ID).HasColumnName("ID");
                });
            }

    然后,就可以在代码里面获取到数据库的视图了:

                var voteItems = from i in dbContext.VoteItemView
                                 where i.VoteID == voteID
                                 select i;

    当然,这样做的话,如果再次调用Scaffold-DbContext命令并且带了-Force参数,我们更改过的DBContext文件的内容就丢失了。所以,我们还可以构造一个自定义的DbContext类TestDbExContext,其继承于Scaffold-DbContext指令自动生成的DbContext类。

    可以参见:EF Core 2.0中如何手动映射数据库的视图为实体

    怎么在EF Core使用SQL命令呢?

    通过Linq、拉姆达表达式,dbContext的Add、SaveChanges等方法可以比较方便地操作数据库。但是有时候仍然想直接执行SQL命令。这就需要用到dbContext.Database.ExecuteSqlCommand命令了。要用到此命令,需要先引用Microsoft.EntityFrameworkCore。否则dbContext.Database就只会包含BeginTransation、CanConnect、CommitTransaction、RollbackTransaction等几个方法或属性,而死活找不到ExecuteSqlCommand。

    using Microsoft.EntityFrameworkCore;
  • 相关阅读:
    H5小游戏的坑点小结
    禁用iOS的UIView长按默认操作
    chrome诡异的Provisional headers are shown
    手机浏览器音频内核的坑
    libuv在cocos2d-x中的使用
    windows下codelite的使用
    windows下clang的安装与使用
    ztree选父不选子选子不选父
    <c:forEach>判断第一条或最后一条记录
    iframe高度自适应的方法
  • 原文地址:https://www.cnblogs.com/AlvinLiang/p/10621910.html
Copyright © 2011-2022 走看看