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"
关于此命令的一些解释,可以参见:
要注意的是,如果数据库更新了,想将项目里面映射的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;