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;

 

posted @ 2019-03-29 16:00  AlvinLiang  阅读(504)  评论(0编辑  收藏  举报