一、什麼是dbfirst?
Dbfirst是一種開發模式,是指先搭建資料庫,然後通過ORM(對象關係映射)工具來生成代碼和數據模型。它相對於codefirst和model first而言,是一種更為傳統的開發方式,在多數情況下,選擇dbfirst開發模式可以帶來更多的好處。
二、為什麼選擇dbfirst?
1、更加方便的資料庫管理
public class DatabaseContext : DbContext
{
public DatabaseContext() : base("DbFirstConnection") { }
public virtual DbSet Users { get; set; }
}
對於一個擁有多張表的資料庫,通過dbfirst方式,我們只需要維護一個大的數據模型,來確保代碼的簡潔性,而對於codefirst和model first方式,我們則需要在每一個實體上進行大量的註解,來維護數據模型,這會使得我們的代碼變得蒼白而不簡潔。
2、更加方便的資料庫更新
Add-Migration DbFirstMigration
Update-Database
在資料庫更新的過程中,使用dbfirst方式同樣可以帶來更多的好處。我們可以直接在資料庫中更新、添加或刪除表,最後再通過ORM工具生成對應的數據模型,來確保資料庫更新的效率和準確性。
3、更加方便的團隊協作
在一個大型項目中,我們通常都需要多人協作,而dbfirst方式可以幫助我們快速生成數據模型,避免在數據模型上的重複工作。同時,在多人協作中,如果我們使用codefirst或model first方式來進行開發,在多人協作時管理起來則較為困難。
三、如何使用dbfirst?
1、使用VS中的「Entity Framework Designer」工具(只適用於EF6)
我們可以通過VS中的「Entity Framework Designer」工具來進行dbfirst開發。
var dbContext = new DatabaseContext();
var users = dbContext.Users.ToList();
2、使用Scaffold-DbContext命令(EF Core)
在EF Core中,我們可以使用Scaffold-DbContext命令來生成數據模型。
Scaffold-DbContext 'Data Source=.;Initial Catalog=DbFirstExample;Integrated Security=true;' Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models
3、使用Database First生成器(EF Core設計器)
我們也可以使用EF Core設計器的Database First生成器來進行dbfirst方式的開發。
代碼示例:
public class DatabaseContext : DbContext
{
public DatabaseContext(DbContextOptions<DatabaseContext> options) : base(options) { }
public virtual DbSet<User> Users { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<User>(entity =>
{
entity.HasKey(e => e.Id);
entity.ToTable("dbo.Users");
entity.Property(e => e.Id).HasColumnName("Id").ValueGeneratedOnAdd();
entity.Property(e => e.Name)
.HasColumnName("Name")
.HasMaxLength(50)
.IsUnicode(false);
});
}
}
四、如何避免常見的dbfirst錯誤?
1、避免在直接在資料庫中進行修改。
如果我們直接在資料庫中進行表結構的修改,將會導致ORM工具失效,從而導致程序無法正常運行。
2、避免手動編輯自動生成的代碼。
在執行Scaffold-DbContext或使用設計器生成數據模型後,我們通常都會自動生成相應的實體、數據上下文等代碼。在這種情況下,我們應該避免手動修改這些自動生成的代碼。
3、避免過度依賴ORM工具。
雖然ORM工具可以帶來很多好處,但是在開發中我們還是應該明確自己需要什麼,並謹慎地使用ORM工具。過度的依賴ORM工具,可能會導致整個項目過於臃腫、維護成本過高。
原創文章,作者:NKRAD,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/318003.html