Entity Framework使用DBContext实现增删改查
发布时间:2023-02-17 10:15:06 所属栏目:asp.Net 来源:互联网
导读:1. 不要Code first, 也不要DB first 我为什么讨厌Code first和DB first呢?首先Code first是先写代码,数据库完全由代码生成,开发阶段尚可,一旦到了产品发布阶段,如果需要添加字段,我们总不能用 visual studio去生产环境上去更新数据库吧,听起来就很可
1. 不要Code first, 也不要DB first 我为什么讨厌Code first和DB first呢?首先Code first是先写代码,数据库完全由代码生成,开发阶段尚可,一旦到了产品发布阶段,如果需要添加字段,我们总不能用 visual studio去生产环境上去更新数据库吧,听起来就很可怕。而且另外的一个问题自动是生成的数据库脚本也不可控,还不如自己提前设计好。DB first也好不了哪去,反向转过来的代码包含很多没有用的文件,而且数据库的更新还要重新走Model生成过程,简直无法理解为什么会有这样的设计。说了这么多,怎么解决呢? 数据库和领域模型分开设计,按照对应关系映射字段,使用自定义链接字串,既不使用领域模型生成数据库,也不用数据库生成领域模型,示例代码如下,SQL Code 以 Destinations和TTable表为例: CREATE TABLE [DBO].[Destinations] ( [DestinationId] [int] PRIMARY KEY NOT NULL, [Name] [nvarchar](max) NULL, [Country] [nvarchar](max) NULL, [Description] [nvarchar](max) NULL, [Photo] [varbinary](max) NULL CREATE TABLE [TTT].[TTable] ( [Id] [int] PRIMARY KEY NOT NULL, [Name] [nvarchar](max) NULL ) Model Class: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Model { public class Destination { public int DestinationId { get; set; } public string Name { get; set; } public string Country { get; set; } public string Description { get; set; } public byte[] Photo { get; set; } public List<Lodging> Lodgings { get; set; } } public class Lodging { public int LodgingId { get; set; } public string Name { get; set; } public string Owner { get; set; } public bool IsResort { get; set; } public Destination Destination { get; set; } } public class TTable { public int Id { get; set; } public string Name { get; set; } } } Connect String: <connectionStrings> <add name="BAContext" connectionString="Data Source=(LocalDb)MSSQLLocalDB;Initial Catalog=DataAccess.BreakAwayContext;Integrated Security=SSPI;" providerName="System.Data.SqlClient" /> </connectionStrings> DB Context: using System.Data.Entity; using System.Data.Entity.ModelConfiguration; using Model; namespace DataAccess { public class TTableConfiguration : EntityTypeConfiguration<TTable> { public TTableConfiguration() { this.ToTable("TTable", "TTT"); } } public class BreakAwayContext : DbContext { protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Configurations.Add(new TTableConfiguration()); } public BreakAwayContext(string connString) : base(connString) { } public DbSet<Destination> Destinations { get; set; } public DbSet<Lodging> Lodgings { get; set; } public DbSet<TTable> TTables { get; set; } } } 2. 如果数据库的表的字段和领域模型的字段不对应,如何处理呢?比如本文的TTable表是在TTT Schema下面的, 而其他表示设计在DBO下面,最方便的方式是使用fluent API, 具体代码如请参见 TTableConfiguration Class和 OnModelCreating()方法,可配置的粒度非常细,比如可以配置领域模型和数据库的哪个Schema的哪张表的哪一列对应,本文是将TTable 类的数据库表配置为了TTT Schema下的TTable表, public class TTableConfiguration : EntityTypeConfiguration<TTable> { public TTableConfiguration() { this.ToTable("TTable", "TTT"); } } 3. 增删该查自带事物支持,具体代码如下, public static int Insert() { var destination = new Destination { Country = "Chs", Description = "Chs is the language package", Name = "xsss" }; using (var context = new BreakAwayContext(ConfigurationManager.ConnectionStrings["BAContext"].ConnectionString)) { var rt = context.Destinations.Add(destination); context.SaveChanges(); return rt.DestinationId; } } public static void Update(Destination destIn) { using (var context = new BreakAwayContext(ConfigurationManager.ConnectionStrings["BAContext"].ConnectionString)) { var dest = context.Destinations.Where(a => a.DestinationId == destIn.DestinationId).Single(); dest.Name = destIn.Name; context.SaveChanges(); } } public static void Delete(int destId) { using (var context = new BreakAwayContext(ConfigurationManager.ConnectionStrings["BAContext"].ConnectionString)) { var destination = new Destination() { DestinationId = destId }; context.Destinations.Attach(destination); context.Destinations.Remove(destination); (编辑:莱芜站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
- asp.net-mvc-3 – MVC3非顺序索引和DefaultModel
- 受asp.net MVC启发的更好的WebForms
- asp.net – App Settings和connectionStrings配置
- asp.net-mvc – 使用没有ORM的ASP.NET MVC
- asp.net – 什么时候Response.IsClientConnected
- .Net Core和RabbitMQ限制循环消费的方法
- asp.net – ResolveUrl / Url.Content在Classic
- Asp.net mvc验证用户登录之Forms实现详解
- asp.net-mvc – 在ASP.NET身份中角色与声明的最佳
- asp.net-mvc – 如何在ASP.NET MVC中生成弹出页面
热点阅读