Entity Framework管理一對二實體關系
在上一篇文章中,簡單的介紹瞭使用Fluent API如何管理一對一的實體關系,在這篇文章中,接著介紹Fluent API如何管理一對多的實體關系。
要在數據庫中配置一對多關系,我們可以依賴EF約定,還可以使用數據註解或Fluent API來顯式創建關系。接下來使用捐贈者Donator和支付方法PayWay這兩個類來舉例子,這裡的一對多關系是:一個人可以通過多種支付方式贊助我。
支付方式類PayWay結構如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace OneToMany.Model.Model { public class PayWay { public int PayWayId { get; set; } public string Name { get; set; } public virtual Donator Donator { get; set; } } }
因為一個贊助者可以通過多種支付方式贊助我,這句話就表明瞭Donator對象應該有一個PayWay的集合,因此,我們要給Donator類新加入一個集合屬性,捐贈者類Donator結構如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace OneToMany.Model.Model { public class Donator { public int Id { get; set; } public string Name { get; set; } public string Amount { get; set; } public DateTime DonateDate { get; set; } /// <summary> /// PayWay類型的集合屬性 /// </summary> public virtual ICollection<PayWay> PayWays { get; set; } } }
Donator類的配置夥伴類的定義如下:
using OneToMany.Model.Model; using System; using System.Collections.Generic; using System.Data.Entity.ModelConfiguration; using System.Linq; using System.Text; using System.Threading.Tasks; namespace OneToMany.Map.Map { public class DonatorMap :EntityTypeConfiguration<Donator> { public DonatorMap() { ToTable("Donator"); //將Name設置為必須 this.Property(p => p.Name).IsRequired(); } } }
PayWay的配置夥伴類的定義如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using OneToMany.Model.Model; using System.Data.Entity.ModelConfiguration; namespace OneToMany.Map.Map { public class PayWayMap : EntityTypeConfiguration<PayWay> { public PayWayMap() { ToTable("PayWay"); this.Property(p => p.Name).HasMaxLength(16); } } }
EFDbContext類定義如下:
using OneToMany.Model.Model; using System; using System.Collections.Generic; using System.Data.Entity; using System.Linq; using System.Text; using System.Threading.Tasks; namespace OneToMany.Map.EFContext { public class EFDbContext:DbContext { public EFDbContext() : base("name=CodeFirstApplication") { } public DbSet<PayWay> PayWays { get; set; } public DbSet<Donator> Donators { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { // 設置主鍵 modelBuilder.Entity<PayWay>().HasKey(p => p.PayWayId); modelBuilder.Entity<Donator>().HasKey(p => p.DonatorId); // 設置一對多 modelBuilder.Entity<Donator>().HasMany(p => p.PayWays).WithRequired(t => t.Donator); base.OnModelCreating(modelBuilder); } } }
控制臺程序定義如下:
using OneToMany.Map.EFContext; using OneToMany.Model.Model; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace OneToManyApplication { class Program { static void Main(string[] args) { using (var context = new EFDbContext()) { var donator = new Donator { Amount = 6, Name = "蝦米", DonateDate = DateTime.Now, PayWays = new List<PayWay> { new PayWay{Name="支付寶"}, new PayWay{Name="微信"} } }; context.Donators.Add(donator); context.SaveChanges(); } Console.WriteLine("執行成功"); Console.ReadKey(); } } }
程序運行後數據庫結構如下:
查詢數據:
到此這篇關於Entity Framework管理一對二實體關系的文章就介紹到這瞭。希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。
推薦閱讀:
- Entity Framework管理一對一實體關系
- Entity Framework實體拆分多個表
- Entity Framework表拆分為多個實體
- Entity Framework使用Code First的實體繼承模式
- Entity Framework使用Code First模式管理視圖