EntityFramework 6.x学习之多个上下文迁移实现分布式

自从项目上了.NET Core平台用上了EntityFramework Core就再没碰过EntityFramework 6.x版本,目前而言EntityFramework 6.x是用的最多,无论是找工作而言还是提升自身技术而言皆自身收益,同时呢,大多数时间除了工作之外,还留有一小部分时间在写EntityFramework 6.x和EntityFramework Core的书籍,所以将EntityFramework 6.x相当于是从零学起,EntityFramework 6.x又添加了许多特性,所以花了一些时间去看并整理了下来,本节相当于是自己一直未碰到过的问题,于是花了一点时间在多个上下文迁移到不同数据库并实现分布式事务上,作为基础入口且同步于书籍,供阅读者学习也是我的点滴积累,文章如有错误,请指正。

模型建立

在开始EntityFramework 6.x内容叙述之前,我们还是老套路,首先准备模型,我们搞一个预约航班的基本模型,一个是航班实体,另外一个为预约实体,请看如下:

/// <summary> /// 航班 /// </summary> public class FlightBooking { /// <summary> /// 航班Id /// </summary> public int FlightId { get; set; } /// <summary> /// 航班名称 /// </summary> public string FilghtName { get; set; } /// <summary> /// 航班号 /// </summary> public string Number { get; set; } /// <summary> /// 出行日期 /// </summary> public DateTime TravellingDate { get; set; } }

/// <summary> /// 预订 /// </summary> public class Reservation { /// <summary> /// 预订Id /// </summary> public int BookingId { get; set; } /// <summary> /// 预订人 /// </summary> public string Name { get; set; } /// <summary> /// 预订日期 /// </summary> public DateTime BookingDate { get; set; } = DateTime.Now; }

public class TripReservation { public FlightBooking Filght { get; set; } public Reservation Hotel { get; set; } }

此类用于维护航班和预约的实体,在创建预约航班时使用。在EntityFramework 6.0+版本上出现了基于代码配置(Code-based Configuration),对于数据库初始化策略和其他等等配置,我们单独建立一个配置类来维护,而无需如我们以往一样放在DbContext上下文派生类构造函数中,这样一来上下文派生类看起来则洁净很多。

public class HotelFlightConfiguration : DbConfiguration { public HotelFlightConfiguration() { SetDatabaseInitializer(new DropCreateDatabaseIfModelChanges<HotelDBContext>()); SetDatabaseInitializer(new DropCreateDatabaseIfModelChanges<FlightDBContext>()); } }

接下来我们再来配置两个DbContext上下文派生类即HotelDbContext和FlightDbContext,并且基本配置信息利用特性来修饰,如下:

[DbConfigurationType(typeof(HotelFlightConfiguration))] public class FlightDBContext : DbContext { public FlightDBContext() : base("name=flightConnection") { } public DbSet<FlightBooking> FlightBookings { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Configurations.Add(new FlightBookingMap()); base.OnModelCreating(modelBuilder); } }

[DbConfigurationType(typeof(HotelFlightConfiguration))] public class HotelDBContext: DbContext { public HotelDBContext():base("name=reservationConnction") { } public DbSet<Reservation> Reservations { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Configurations.Add(new ReservationMap()); base.OnModelCreating(modelBuilder); } }

对应的映射配置已经叙述很多次了,我们不用废话,直接给出。

public class FlightBookingMap : EntityTypeConfiguration<FlightBooking> { public FlightBookingMap() { //table ToTable("FlightBookings"); //key HasKey(k => k.FlightId); //property Property(p => p.FilghtName).HasMaxLength(50); Property(p => p.Number); Property(p => p.TravellingDate); } }

public class ReservationMap : EntityTypeConfiguration<Reservation> { public ReservationMap() { //table ToTable("Reservations"); //key HasKey(k => k.BookingId); //property Property(p => p.BookingId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); Property(p => p.Name).HasMaxLength(20); Property(p => p.BookingDate); } }

如上两个上下文我们将迁移到不同数据库,所以连接字符串当然是两个啦。

<connectionStrings> <add connectionString="Data Source=WANGPENG;Initial Catalog=ReservationDb;Integrated Security=true" providerName="System.Data.SqlClient" /> <add connectionString="Data Source=WANGPENG;Initial Catalog=FlightDb;Integrated Security=true" providerName="System.Data.SqlClient" /> </connectionStrings>

好了,模型和上下文一切都已构建完毕,接下来进入到迁移,请往下看。

多个上下文迁移

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wdpwdz.html