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(); } } } |
执行后结果如下
简单的使用到此为止。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构