Entity Framework 一對多關係映射

EF中關係映射也是一個很關鍵的內容,關係映射和屬性映射同樣,也是在 OnModelCreating 中配置映射。EF中的關係映射有以下三種:數據庫

  1. One-to-Many Relationship(一對多)
  2. Many-to-Many Relationship(多對多)
  3. One-to-One Relationship(一對一)

咱們今天先講解 One-to-Many Relationship(一對一關係)ide

零、建立所需類

  • 全部實體類公用的抽象基類
public abstract class Base
{
    public int Id { get; set; }
    public DateTime CreateTime { get; set; }
    public DateTime ModifiedTime { get; set; }
}
  • 客戶類和訂單類
public class Customer : Base
{
    public string Name { get; set; }
    public string Email { get; set; }
    public virtual ICollection<Order> Orders { get; set; }
}

public class Order : Base
{
    public byte Quanatity { get; set; }
    public int Price { get; set; }
    public int CoustomerId { get; set; }
    public virtual Customer Customer { get; set; }
}

1、One-to-Many Relationship

  • 建立Map映射類

在編寫代碼以前,咱們先分析一下客戶和訂單的關係。一個客戶能夠有多個訂單,但一個訂單隻能屬於一個客戶,因此咱們用到了EF中的 HasRequired,一個客戶又存在多個訂單,所以也使用到了 WithMany ,同時 Order 表中有 CustomerId 做爲外鍵,所以咱們用到了 HasForeignKey 。根據咱們的分析,編寫代碼以下:ui

public class CustomerMap : EntityTypeConfiguration<Customer>
{
    public CustomerMap()
    {
        //數據庫映射的表名稱
        ToTable("Customer");
        //主鍵
        HasKey(p => p.Id);
        //屬性映射的字段屬性
        Property(p => p.Name).HasColumnType("VARCHAR").HasMaxLength(50).IsRequired();
        Property(p => p.Email).HasColumnType("VARCHAR").HasMaxLength(50).IsRequired();
        Property(p => p.CreateTime);
        Property(p => p.ModifiedTime);
        //設置關係
        HasMany(t => t.Orders).WithRequired(t => t.Customer).HasForeignKey(t => t.CoustomerId).WillCascadeOnDelete(false);
    }
}

public class OrderMap : EntityTypeConfiguration<Order>
{
    public OrderMap()
    {
        ToTable("Order");
        HasKey(p => p.Id);
        Property(p => p.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
        Property(p => p.Quanatity);
        Property(p => p.Price);
        Property(p => p.CoustomerId);
        Property(p => p.CreateTime);
        Property(p => p.ModifiedTime);


    }
}
  • 註冊映射類
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    var typeToRegister = Assembly.GetExecutingAssembly().GetTypes()
        .Where(t => !String.IsNullOrEmpty(t.Namespace))
        .Where(t => t.BaseType != null
        && t.BaseType.IsGenericType
        && t.BaseType.GetGenericTypeDefinition() == typeof(EntityTypeConfiguration<>));

    foreach(var type in typeToRegister)
    {
        dynamic configurationInstance = Activator.CreateInstance(type);
        modelBuilder.Configurations.Add(configurationInstance);
    }
    base.OnModelCreating(modelBuilder);
}
注1:在實際項目中須要編寫不少的實體類,若是將全部實體類的映射直接寫在 OnModelCreating 中會形成代碼臃腫,不易維護,所以咱們在這裏將每一個類的映射寫在對應的映射文件中,最後再將每一個類的映射類註冊到 OnModelCreating

注2:上述代碼和描述是從客戶的方向連編寫的關係映射,若是以訂單的角度來編寫關係映射的話,只需刪掉CustomerMap中的關係配置,在OrderMap中增長關係配置部分修改以下:spa

HasRequired(p => p.Customer).WithMany(p => p.Orders).HasForeignKey(p => p.CoustomerId).WillCascadeOnDelete(false);

運行控制檯代碼後,咱們將在數據庫看到表和表關係都被建立了:code

Z1xRKA.png

相關文章
相關標籤/搜索