• EF Code First关系规则及配置


    1、一对多关系

    关系表:

    Category 分类表

    Product 产品表

    分类与产品之间的一对多关系

    1>、产品实体类不指定外键属性

    Domain中类定义:

    Category.cs

     1 using System;
    2 using System.Collections.Generic;
    3 using System.Linq;
    4 using System.Text;
    5
    6 using System.ComponentModel.DataAnnotations;
    7
    8 namespace Northwind.Domain.Entities
    9 {
    10 public class Category
    11 {
    12 /// <summary>
    13      /// 分类ID
    14      /// </summary>
    15 public int CategoryID { get; set; }
    16
    17 /// <summary>
    18      /// 分类名称
    19      /// </summary>
    20 public string CategoryName { get; set; }
    21
    22 /// <summary>
    23      /// 描述
    24      /// </summary>
    25 public string Description { get; set; }
    26
    27 /// <summary>
    28      /// 图片
    29      /// </summary>
    30 public byte[] Picture { get; set; }
    31
    32 /// <summary>
    33      /// 产品
    34      /// </summary>
    35 public virtual ICollection<Product> Products { get; set; }
    36 }
    37 }

    Product.cs

     1 using System;
    2 using System.Collections.Generic;
    3 using System.Linq;
    4 using System.Text;
    5
    6 namespace Northwind.Domain.Entities
    7 {
    8 public class Product
    9 {
    10 /// <summary>
    11      /// 产品ID
    12      /// </summary>
    13 public int ProductID { get; set; }
    14
    15 /// <summary>
    16      /// 产品名称
    17      /// </summary>
    18 public string ProductName { get; set; }
    19
    20 /// <summary>
    21     /// 单价
    22      /// </summary>
    23 public decimal UnitPrice { get; set; }
    24
    25 /// <summary>
    26     /// 库存
    27      /// </summary>
    28 public int UnitsInStock { get; set; }
    29
    30 /// <summary>
    31      /// 是否售完
    32      /// </summary>
    33 public bool Discontinued { get; set; }
    34
    35 /// <summary>
    36      /// 产品分类
    37      /// </summary>
    38 public virtual Category Category { get; set; }
    39 }
    40 }

    CategoryMap.cs

     1 using System;
    2 using System.Collections.Generic;
    3 using System.Linq;
    4 using System.Text;
    5
    6 using System.Data.Entity.ModelConfiguration;
    7 using System.ComponentModel.DataAnnotations;
    8
    9 using Northwind.Domain.Entities;
    10
    11 namespace Northwind.Domain.Mapping
    12 {
    13 public class CategoryMap : EntityTypeConfiguration<Category>
    14 {
    15 public CategoryMap()
    16 {
    17 this.ToTable("dbo.Category");
    18 this.HasKey(t => t.CategoryID);
    19
    20 this.Property(t => t.CategoryName).IsRequired().HasMaxLength(15);
    21 this.Property(t => t.Picture).HasColumnType("image");
    22 }
    23 }
    24 }

    ProductMap.cs

     1 using System;
    2 using System.Collections.Generic;
    3 using System.Linq;
    4 using System.Text;
    5
    6 using System.Data.Entity.ModelConfiguration;
    7 using System.ComponentModel.DataAnnotations;
    8
    9 using Northwind.Domain.Entities;
    10
    11 namespace Northwind.Domain.Mapping
    12 {
    13 public class ProductMap : EntityTypeConfiguration<Product>
    14 {
    15 public ProductMap()
    16 {
    17 this.ToTable("dbo.Product");
    18 this.HasKey(t => t.ProductID);
    19
    20 this.Property(t => t.ProductName).IsRequired().HasMaxLength(50);
    21 this.Property(t => t.UnitPrice).HasPrecision(18, 2);
    22 }
    23 }
    24 }

    Data中类定义:

    NorthwindContext.cs

     1 using System;
    2 using System.Collections.Generic;
    3 using System.Linq;
    4 using System.Text;
    5
    6 using System.Data.Entity;
    7
    8 using Northwind.Domain.Entities;
    9 using Northwind.Domain.Mapping;
    10
    11 namespace Northwind.Data
    12 {
    13 public class NorthwindContext : DbContext
    14 {
    15 public DbSet<Category> Categories { get; set; }
    16 public DbSet<Product> Products { get; set; }
    17
    18 protected override void OnModelCreating(DbModelBuilder modelBuilder)
    19 {
    20 modelBuilder.Configurations.Add(new CategoryMap());
    21 modelBuilder.Configurations.Add(new ProductMap());
    22 }
    23 }
    24 }

    App中类定义:

    Program.cs

     1 using System;
    2 using System.Collections.Generic;
    3 using System.Linq;
    4 using System.Text;
    5
    6 using Northwind.Data;
    7 using Northwind.Domain.Entities;
    8
    9 using System.Data.Entity;
    10
    11 namespace Northwind.App
    12 {
    13 class Program
    14 {
    15 static void Main(string[] args)
    16 {
    17 // 数据模型改变,删除数据库重新创建。
    18 Database.SetInitializer(new DropCreateDatabaseIfModelChanges<NorthwindContext>());
    19
    20 Category c = new Category() { CategoryName = "电子数码" };
    21
    22 Product p = new Product() { ProductName = "笔记本电脑", UnitPrice = 4500.00m, Category = c, UnitsInStock = 100, Discontinued = false };
    23 using (NorthwindContext db = new NorthwindContext())
    24 {
    25 db.Categories.Add(c);
    26 db.Products.Add(p);
    27
    28 db.SaveChanges();
    29 }
    30
    31 Console.WriteLine("Finish");
    32 Console.ReadKey();
    33 }
    34 }
    35 }

    运行之后生成的数据库结构

    2>、产品实体类中指定外键属性

    修改Domain中Product.cs代码:

     1 using System;
    2 using System.Collections.Generic;
    3 using System.Linq;
    4 using System.Text;
    5
    6 namespace Northwind.Domain.Entities
    7 {
    8 public class Product
    9 {
    10 /// <summary>
    11     /// 产品ID
    12      /// </summary>
    13 public int ProductID { get; set; }
    14
    15 /// <summary>
    16      /// 产品名称
    17      /// </summary>
    18 public string ProductName { get; set; }
    19
    20 /// <summary>
    21      /// 单价
    22      /// </summary>
    23 public decimal UnitPrice { get; set; }
    24
    25 /// <summary>
    26      /// 库存
    27      /// </summary>
    28 public int UnitsInStock { get; set; }
    29
    30 /// <summary>
    31      /// 是否售完
    32      /// </summary>
    33 public bool Discontinued { get; set; }
    34
    35 /// <summary>
    36      /// 分类ID
    37      /// </summary>
    38 public int CategoryID { get; set; }
    39
    40 /// <summary>
    41      /// 产品分类
    42      /// </summary>
    43 public virtual Category Category { get; set; }
    44 }
    45 }

    运行之后生成的数据库中表结构如下:

      默认的外键规则:[Target Type Key Name], [Target Type Name] + [Target Type Key Name], 或者 [Navigation
    Property Name] + [Target Type Key Name]。
    3>、使用Data Annotations指定外键属性

     1 using System;
    2 using System.Collections.Generic;
    3 using System.Linq;
    4 using System.Text;
    5
    6 using System.ComponentModel.DataAnnotations;
    7
    8 namespace Northwind.Domain.Entities
    9 {
    10 public class Product
    11 {
    12 /// <summary>
    13      /// 产品ID
    14      /// </summary>
    15 public int ProductID { get; set; }
    16
    17 /// <summary>
    18      /// 产品名称
    19      /// </summary>
    20 public string ProductName { get; set; }
    21
    22 /// <summary>
    23      /// 单价
    24      /// </summary>
    25 public decimal UnitPrice { get; set; }
    26
    27 /// <summary>
    28      /// 库存
    29      /// </summary>
    30 public int UnitsInStock { get; set; }
    31
    32 /// <summary>
    33      /// 是否售完
    34      /// </summary>
    35 public bool Discontinued { get; set; }
    36
    37 /// <summary>
    38      /// 分类ID
    39      /// </summary>
    40 public int CategoryID { get; set; }
    41
    42 /// <summary>
    43      /// 产品分类
    44      /// </summary>
    45 [ForeignKey("CategoryID")]
    46 public virtual Category Category { get; set; }
    47 }
    48 }

    4>、使用Fluent指定外键属性

     1 using System;
    2 using System.Collections.Generic;
    3 using System.Linq;
    4 using System.Text;
    5
    6 using System.Data.Entity.ModelConfiguration;
    7 using System.ComponentModel.DataAnnotations;
    8
    9 using Northwind.Domain.Entities;
    10
    11 namespace Northwind.Domain.Mapping
    12 {
    13 public class ProductMap : EntityTypeConfiguration<Product>
    14 {
    15 public ProductMap()
    16 {
    17 // Primary Key
    18 this.HasKey(t => t.ProductID);
    19
    20 // Properties
    21 this.Property(t => t.ProductName).IsRequired().HasMaxLength(50);
    22 this.Property(t => t.UnitPrice).HasPrecision(18, 2);
    23
    24 // Table & Column Mappings
    25 this.ToTable("dbo.Product");
    26 this.Property(t => t.ProductID).HasColumnName("ProductID");
    27 this.Property(t => t.ProductName).HasColumnName("ProductName");
    28 this.Property(t => t.UnitPrice).HasColumnName("UnitPrice");
    29 this.Property(t => t.UnitsInStock).HasColumnName("UnitsInStock");
    30 this.Property(t => t.Discontinued).HasColumnName("Discontinued");
    31 this.Property(t => t.CategoryID).HasColumnName("CategoryID");
    32
    33 // Relationships
    34 this.HasRequired(t => t.Category)
    35 .WithMany(t => t.Products)
    36 .HasForeignKey(t => t.CategoryID)
    37 .WillCascadeOnDelete(false);
    38 }
    39 }
    40 }

    5>、示例代码附件

      以上示例代码附件,并补充Product与Category及Supplier的两个外键关联。

      Northwind-一对多外键.rar

    二、多对多关系

    表说明:

    用户表:User

    角色表:Role

    用户与角色多对多,一个用户可以属于多个角色,一个角色可以有多个用户。

    Domain中User.cs

     1 using System;
    2 using System.Collections.Generic;
    3 using System.Linq;
    4 using System.Text;
    5
    6 namespace Northwind.Domain.Entities
    7 {
    8 public class User
    9 {
    10 /// <summary>
    11      /// 用户ID
    12      /// </summary>
    13 public int UserID { get; set; }
    14
    15 /// <summary>
    16      /// 用户名
    17      /// </summary>
    18 public string UserName { get; set; }
    19
    20 /// <summary>
    21      /// 密码
    22      /// </summary>
    23 public string Password { get; set; }
    24
    25 /// <summary>
    26      /// 角色
    27      /// </summary>
    28 public ICollection<Role> Roles { get; set; }
    29 }
    30 }

    Role.cs

     1 using System;
    2 using System.Collections.Generic;
    3 using System.Linq;
    4 using System.Text;
    5
    6 namespace Northwind.Domain.Entities
    7 {
    8 public class Role
    9 {
    10 /// <summary>
    11      /// 角色ID
    12      /// </summary>
    13 public int RoleID { get; set; }
    14
    15 /// <summary>
    16      /// 角色名称
    17      /// </summary>
    18 public string RoleName { get; set; }
    19
    20 /// <summary>
    21      /// 用户
    22      /// </summary>
    23 public virtual ICollection<User> Users { get; set; }
    24 }
    25 }

    UserMap.cs

     1 using System;
    2 using System.Collections.Generic;
    3 using System.Linq;
    4 using System.Text;
    5
    6 using System.Data.Entity.ModelConfiguration;
    7 using System.ComponentModel.DataAnnotations;
    8
    9 using Northwind.Domain.Entities;
    10
    11 namespace Northwind.Domain.Mapping
    12 {
    13 public class UserMap : EntityTypeConfiguration<User>
    14 {
    15 public UserMap()
    16 {
    17 // Primary Key
    18 this.HasKey(t => t.UserID);
    19
    20 // Properties
    21 this.Property(t => t.UserName).IsRequired().HasMaxLength(50);
    22 this.Property(t => t.Password).IsRequired().HasMaxLength(50);
    23
    24 // Table & Column Mappings
    25 this.ToTable("dbo.User");
    26 this.Property(t => t.UserID).HasColumnName("UserID");
    27 this.Property(t => t.UserName).HasColumnName("UserName");
    28 this.Property(t => t.Password).HasColumnName("Password");
    29
    30 // Relationships
    31 this.HasMany(t => t.Roles)
    32 .WithMany(t => t.Users)
    33 .Map(t => t.MapLeftKey("RoleID").MapRightKey("UserID"));
    34 }
    35 }
    36 }

    RoleMap.cs

     1 using System;
    2 using System.Collections.Generic;
    3 using System.Linq;
    4 using System.Text;
    5
    6 using System.Data.Entity.ModelConfiguration;
    7 using System.ComponentModel.DataAnnotations;
    8
    9 using Northwind.Domain.Entities;
    10
    11 namespace Northwind.Domain.Mapping
    12 {
    13 public class RoleMap : EntityTypeConfiguration<Role>
    14 {
    15 public RoleMap()
    16 {
    17 // Primary Key
    18 this.HasKey(t => t.RoleID);
    19
    20 // Properties
    21 this.Property(t => t.RoleName).IsRequired().HasMaxLength(50);
    22
    23 // Table & Column Mappings
    24 this.ToTable("dbo.Role");
    25 this.Property(t => t.RoleID).HasColumnName("RoleID");
    26 this.Property(t => t.RoleName).HasColumnName("RoleName");
    27
    28 // Relationships
    29 this.HasMany(t => t.Users)
    30 .WithMany(t => t.Roles)
    31 .Map(t => t.MapLeftKey("UserID").MapRightKey("RoleID"));
    32 }
    33 }
    34 }

    Data中NorthwindContext.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    using System.Data.Entity;

    using Northwind.Domain.Entities;
    using Northwind.Domain.Mapping;

    namespace Northwind.Data
    {
    public class NorthwindContext : DbContext
    {
    public DbSet<Category> Categories { get; set; }
    public DbSet<Product> Products { get; set; }
    public DbSet<Supplier> Suppliers { get; set; }
    public DbSet<User> Users { get; set; }
    public DbSet<Role> Roles { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
    modelBuilder.Configurations.Add(new CategoryMap());
    modelBuilder.Configurations.Add(new ProductMap());
    modelBuilder.Configurations.Add(new SupplierMap());
    modelBuilder.Configurations.Add(new UserMap());
    modelBuilder.Configurations.Add(new RoleMap());
    }
    }
    }

    运行成功后生成的数据表:

    三、一对一关系

    待补充

  • 相关阅读:
    7-25 念数字
    7-24 约分最简分式
    7-23 币值转换
    HDU-1102-Constructing Roads
    HDU-1301-Jungle Roads
    链式向前星
    HDU-1217-Arbitrage(SPFA)
    POJ-1258-Agri-Net
    HDU-1863-畅通工程
    POJ-3050-Hoscotch
  • 原文地址:https://www.cnblogs.com/libingql/p/2421084.html
Copyright © 2020-2023  润新知