CompanyDB,模擬公司組織架構,以圖表呈現如下圖:
資料庫規劃說明
Staff
(員工)、Information
(員工資料)、Department
(部門)、Project
(執行專案)、StaffProject
(員工專案分配)GetDepartmentProject
(取得部門進行中專案)DepartmentStaff
(人員部門檢視)在專案項目中點擊右鍵,選擇 加入=>新增項目,選擇 ADO.NET實體資料模型,名稱輸入 Company。
以資料庫優先的方式使用 Entity Framework,所以選擇 來自資料庫的EF Designer。
點擊 新增連接
輸入連線資料後,選擇剛才建立的範例資料庫
回到 選擇資料連接畫面後,點擊 下一步
將資料表、檢視、預存程序和函式打勾
完成之後在專案中會多了 Company.edmx 檔案
在完成 Entity Framework 設定後,用 Model Browser 來觀看 Company.edmx
EDMX 說明:
public partial class CompanyDBEntities : DbContext
{
public CompanyDBEntities() : base("name=CompanyDBEntities")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}
public virtual DbSet<Department> Department { get; set; }
public virtual DbSet<Information> Information { get; set; }
public virtual DbSet<Project> Project { get; set; }
public virtual DbSet<Staff> Staff { get; set; }
public virtual DbSet<DepartmentStaff> DepartmentStaff { get; set; }
public virtual ObjectResult<GetDepartmentProject_Result> GetDepartmentProject(string departmentID)
{
var departmentIDParameter = departmentID != null ?
new ObjectParameter("DepartmentID", departmentID) :
new ObjectParameter("DepartmentID", typeof(string));
return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<GetDepartmentProject_Result>("GetDepartmentProject", departmentIDParameter);
}
}
程式說明:
<connectionStrings>
<add name="CompanyDBEntities" connectionString="metadata=res://*/Company.csdl|res://*/Company.ssdl|res://*/Company.msl;provider=System.Data.SqlClient;provider connection string="data source=localhost;initial catalog=CompanyDB;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
</connectionStrings>
using (CompanyDBEntities context = new CompanyDBEntities())
{
foreach (Staff staff in context.Staff)
{
Console.WriteLine(staff.Name);
}
}
using (CompanyDBEntities context = new CompanyDBEntities())
{
foreach (Department department in context.Department)
{
Console.WriteLine(department.Name);
foreach (Staff staff in department.Staff)
{
Console.WriteLine($"--{staff.Name}");
}
}
}
針對 Department 中的Staff 導覽屬性,Entity Framework 採取延遲載入,也就是當 Staff 資料被使用到時,才會向資料庫進行讀取。
Entity Framework 提供資料的增刪查改操作,如果遇到較複雜的 SQL 操作,則可以透過寫好預存程序來執行 SQL 的語法操作。
範例資料庫建立好一個預存程序,查詢部門人員進行中的專案,名稱為 GetDepartmentProject
,預存程序結果類別為ObjectResult
。
using (CompanyDBEntities context = new CompanyDBEntities())
{
foreach (Department department in context.Department)
{
Console.WriteLine(department.Name);
ObjectResult departProject = context.GetDepartmentProject(department.ID);
foreach (GetDepartmentProject_Result result in departProject)
{
Console.WriteLine($"--{result.Name}:{result.Project}");
}
}
}
using (CompanyDBEntities context = new CompanyDBEntities())
{
foreach (DepartmentStaff departmentStaff in context.DepartmentStaff)
{
Console.WriteLine($"{departmentStaff.Department},{departmentStaff.Staff}");
}
}
Entity Framework
Database First