Entity Framework 自动生成CodeFirst代码
前言
在前面的文章中我们提到Entity Framework的“Code First”模式也同样可以基于现有数据库进行开发。今天就让我们一起看一下使用Entity Framework Power Tools如何基于现有数据库生成数据类和数据库上下等。
Entity Framework Power Tools
基于现有数据库生成POCO数据类和数据库上下文需要借助Visual Studio一个扩展插件-- Entity Framework Power Tools(一个Code First反向工程工具)。
通过点击上图的扩展和更新,得到如下图所示的界面
安装完之后只要在项目上右键选择Entity Framework->Reverse Engineer Code First(项目中首先需要安装Entity Framework 包,否则会有错误),然后在弹出的窗口中输入相关的数据库连接信息即可(我们这里使用“NorthWind”数据库)。
当然当你在操作的时候你首先还是要先引用Entity Framework。然后点击Reverse Engineer Code First
配置好数据库链接,
确认之后,我们首先来看一下配置文件的变化
<?xml version="1.0" encoding="utf-8"?> <configuration> <configSections> <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> </configSections> <connectionStrings> <add name="NorthwindContext" connectionString="Data Source=.;Initial Catalog=Northwind;Integrated Security=True;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" /> </connectionStrings> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> <entityFramework> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> <parameters> <parameter value="v11.0" /> </parameters> </defaultConnectionFactory> </entityFramework> </configuration>
于此同时生成了NorthWindContext数据库操作上下文
using System.Data.Entity; using System.Data.Entity.Infrastructure; using CodeFirstPowerTools.Models.Mapping; namespace CodeFirstPowerTools.Models { public partial class NorthwindContext : DbContext { static NorthwindContext() { Database.SetInitializer<NorthwindContext>(null); } public NorthwindContext() : base("Name=NorthwindContext") { } public DbSet<Category> Categories { get; set; } public DbSet<CustomerDemographic> CustomerDemographics { get; set; } public DbSet<Customer> Customers { get; set; } public DbSet<Employee> Employees { get; set; } public DbSet<Order_Detail> Order_Details { get; set; } public DbSet<Order> Orders { get; set; } public DbSet<Product> Products { get; set; } public DbSet<Region> Regions { get; set; } public DbSet<Shipper> Shippers { get; set; } public DbSet<Supplier> Suppliers { get; set; } public DbSet<Territory> Territories { get; set; } public DbSet<Alphabetical_list_of_product> Alphabetical_list_of_products { get; set; } public DbSet<Category_Sales_for_1997> Category_Sales_for_1997 { get; set; } public DbSet<Current_Product_List> Current_Product_Lists { get; set; } public DbSet<Customer_and_Suppliers_by_City> Customer_and_Suppliers_by_Cities { get; set; } public DbSet<Invoice> Invoices { get; set; } public DbSet<Order_Details_Extended> Order_Details_Extendeds { get; set; } public DbSet<Order_Subtotal> Order_Subtotals { get; set; } public DbSet<Orders_Qry> Orders_Qries { get; set; } public DbSet<Product_Sales_for_1997> Product_Sales_for_1997 { get; set; } public DbSet<Products_Above_Average_Price> Products_Above_Average_Prices { get; set; } public DbSet<Products_by_Category> Products_by_Categories { get; set; } public DbSet<Sales_by_Category> Sales_by_Categories { get; set; } public DbSet<Sales_Totals_by_Amount> Sales_Totals_by_Amounts { get; set; } public DbSet<Summary_of_Sales_by_Quarter> Summary_of_Sales_by_Quarters { get; set; } public DbSet<Summary_of_Sales_by_Year> Summary_of_Sales_by_Years { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Configurations.Add(new CategoryMap()); modelBuilder.Configurations.Add(new CustomerDemographicMap()); modelBuilder.Configurations.Add(new CustomerMap()); modelBuilder.Configurations.Add(new EmployeeMap()); modelBuilder.Configurations.Add(new Order_DetailMap()); modelBuilder.Configurations.Add(new OrderMap()); modelBuilder.Configurations.Add(new ProductMap()); modelBuilder.Configurations.Add(new RegionMap()); modelBuilder.Configurations.Add(new ShipperMap()); modelBuilder.Configurations.Add(new SupplierMap()); modelBuilder.Configurations.Add(new TerritoryMap()); modelBuilder.Configurations.Add(new Alphabetical_list_of_productMap()); modelBuilder.Configurations.Add(new Category_Sales_for_1997Map()); modelBuilder.Configurations.Add(new Current_Product_ListMap()); modelBuilder.Configurations.Add(new Customer_and_Suppliers_by_CityMap()); modelBuilder.Configurations.Add(new InvoiceMap()); modelBuilder.Configurations.Add(new Order_Details_ExtendedMap()); modelBuilder.Configurations.Add(new Order_SubtotalMap()); modelBuilder.Configurations.Add(new Orders_QryMap()); modelBuilder.Configurations.Add(new Product_Sales_for_1997Map()); modelBuilder.Configurations.Add(new Products_Above_Average_PriceMap()); modelBuilder.Configurations.Add(new Products_by_CategoryMap()); modelBuilder.Configurations.Add(new Sales_by_CategoryMap()); modelBuilder.Configurations.Add(new Sales_Totals_by_AmountMap()); modelBuilder.Configurations.Add(new Summary_of_Sales_by_QuarterMap()); modelBuilder.Configurations.Add(new Summary_of_Sales_by_YearMap()); } } }
最终来查看一下生成的文件
代码调用实例
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using CodeFirstPowerTools.Models; namespace CodeFirstPowerTools { class Program { static void Main(string[] args) { using (var db = new NorthwindContext()) { IQueryable<Order> orders = from order in db.Orders where order.OrderID < 10256 select order; foreach (Order order in orders) { Console.WriteLine(order.ShipCity); } } Console.ReadLine(); } } }
执行后结果如下
简单的使用到此为止。