.net ef 字段不区分大小写_第六节:框架搭建之EF的Fluent Api模式的使用流程

本文介绍了使用Fluent API在.NET EF CodeFirst模式中的实践过程,包括不采用传统三层架构的项目结构,以及在业务模拟场景下如何处理数据增删。详细阐述了从创建实体类、配置文件,到数据库生成、字段变更及数据迁移的步骤,展示了当字段变化时,如何关闭数据库初始化策略并手动修改以避免错误。
摘要由CSDN通过智能技术生成

一. 前言

沉寂了约一个月的时间,今天用一篇简单的文章重新回归博客,主要来探讨一下Fluent Api模式在实际项目中的使用流程。

1. Fluent API属于EF CodeFirst模式的一种,EF还有一种模式是DataAnnotations,两种模式各有千秋吧,前面的EF系列已经详细介绍过他们的使用了,本节主要介绍 Fluent API模式在实际框架中的使用流程.

本节需要用到的技术有:

  ①:EF的三种模式(四) 之 原生正宗的 CodeFirst模式的默认约定

②:EF的CodeFirst模式通过DataAnnotations修改默认协定

③:EF的CodeFirst模式通过Fluent API修改默认协定

④:EF的CodeFirst模式的四种初始化策略和通过Migration进行数据的迁移

2. 框架模式

这里不采用传统的三层架构(DAL、BLL),而是使用:Ypf.DTO、Ypf.Service、Ypf.IService、Ypf.Utils、Ypf.Web 这种划分模式,本节为了方便测试,仅仅使用 Ypf.Service 和 Ypf.Test(控制台)两个框架进行测试。

3. 业务模拟

①. 用户基本信息和角色基本信息,不做关联

②. 用户信息增加了或者删除

③. 角色信息删除了或者增加

二. 使用步骤

1. 新建【Ypf.Service】类库和【Ypf.Test】控制台项目,并分别通过Nuget安装EF程序集。

34e518ba5f867dbdbe081b0135d9675d.png

2. 在【Ypf.Service】类库中新建“UserInfor”、“RoleInfor”实体类,“UserInforConfig”、“RoleInforConfig”实体类对应的隔离出来的表的配置文件。

PS:这里为了方便管理,一张表对应一个EF的配置类文件,比全部直接写在 OnModelCreating 方法中更清晰。

分享实体类代码:

 1 ///  2 /// 用户表 3 ///  4 public class UserInfor 5 { 6 public string id { get; set; } 8 public string userName { get; set; }10 public int userAge { get; set; }11 14 }15 /// 16 /// 角色信息17 /// 18 public class RoleInfor19 {20 public string id { get; set; }22 public string roleName { get; set; }24 public int roleAge { get; set; }25 }

享表配置文件代码:

 1 ///  2 /// UserInfor实体对应表的配置 3 ///  4 class UserInforConfig :EntityTypeConfiguration 5 { 6 public UserInforConfig() 7 { 8 this.ToTable("T_UserInfor"); 9 this.HasKey(u => u.id).Property(u => u.id).HasColumnType("varchar").HasMaxLength(32);10 this.Property(u => u.userName).HasColumnType("varchar").HasMaxLength(50);11 this.Property(u => u.userAge).HasColumnType("int").IsRequired();12 }13 }14 /// 15 /// RoleInfor实体对应表的配置16 /// 17 class RoleInforConfig : EntityTypeConfiguration18 {19 public RoleInforConfig()20 {21 this.ToTable("T_RoleInfor");22 this.HasKey(u => u.id).Property(u => u.id).HasColumnType("varchar").HasMaxLength(32);23 this.Property(u => u.roleName).HasColumnType("varchar").HasMaxLength(50);24 this.Property(u => u.roleAge).HasColumnType("int").IsRequired();25 }26 }

DB不存在则创建,实体不对应则报错

分享EF上下文的代码

 public class YpfContext:DbContext { ///  /// 继承父类构造函数,ypfConnectionString代表配置文件中连接字符串的名字 ///  public YpfContext():base("name=ypfConnectionString") { } ///  /// OnModelCreating方法重写,FluentAPI对表的配置都是在该方法中,但是当表数量多的话 /// 该方法内部就会显得特别乱,所以我们这里采用分离的方式,一张表对应一个配置文件类, /// 最后全部注册到该方法中即可 ///  ///  protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); //1. 分开注册 //modelBuilder.Configurations.Add(new UserInforConfig()); //modelBuilder.Configurations.Add(new RoleInforConfig()); //2. 一次性加载所有Fluent API的配置 modelBuilder.Configurations.AddFromAssembly(Assembly.GetExecutingAssembly()); } public DbSet UserInfor { get; set; } public DbSet RoleInfor { get; set; } }

4. 给【Ypf.Test】配置数据库连接字符串,并且进行一个简单的数据库查询操作,会发现在SQLServer默认目录生成一个名为“FrameFluentApiDB”的数据库,且表、字段对应均正确。

分享数据库连接字符串代码:

1 2 3 

分享简单的数据库查询代码:

 1 class Program 2 { 3 static void Main(string[] args) 4 { 5 using (YpfContext db=new YpfContext()) 6 { 7 var list = db.UserInfor.ToList(); 8  9 Console.WriteLine("创建成功");10 Console.ReadKey();11 }12 }13 }

运行后生成的数据库:

cadb2ab96d27e5dec264cfe67ebfee51.png

5. 给UserInfor实体增加一个“userSex”属性,并在UserInforConfig文件中对该属性进行配置,如下图,再次运行代码,报错,提示上下文发生改变,请走数据迁移。

修改后代码:

c56b4c6082de9295cd5849ee28c5fbb9.png
53b95fab3740f12eb292812c5c431a13.png

报错提示:

1166d6fb0163b13d1ce4d92e72fb87f4.png

PS:配置数据迁移策略固然可以解决该问题,但我们这里用一种比较笨的方法,关闭数据库初始化策略,然后手动配置代码和修改数据库字段进行对应即可。

分享关闭数据库初始化策略的代码:

70697ab19ed76b9c1017b053828dc0f5.png

手动修改数据库和代码实体中的属性对应后重新运行代码,运行成功。

e521e5270d4bad4b848b2b749c4abb5f.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值