1、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 c
2、lass Category11 12 / 13 / 分类ID14 / 15 public int CategoryID get; set; 16 17 / 18 / 分类名称19 / 20 public string CategoryName get; set; 21 22 / 23 / 描述24 / 25 public string Description get; set; 26 27 / 28 / 图片29 / 30 public byte Picture get; set; 31 32 / 33 / 产品34 / 35 public virtual ICollection Produc
3、ts 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 / 11 / 产品ID12 / 13 public int ProductID get; set; 14 15 / 16 / 产品名称17 / 18 public string ProductName get;
4、set; 19 20 / 21 / 单价22 / 23 public decimal UnitPrice get; set; 24 25 / 26 / 库存27 / 28 public int UnitsInStock get; set; 29 30 / 31 / 是否售完32 / 33 public bool Discontinued get; set; 34 35 / 36 / 产品分类37 / 38 public virtual Category Category get; set; 39 40 CategoryMap.cs 1 using System; 2 using System.
5、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.Mapping12 13 public class CategoryMap : EntityTypeConfiguration14 15 pub
6、lic 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
7、; 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.Mapping12 13 public class ProductMap : EntityTypeConfiguration14 15 public ProductMap()16 17 this.ToTable(dbo.Pr
8、oduct);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 us
9、ing System.Data.Entity; 7 8 using Northwind.Domain.Entities; 9 using Northwind.Domain.Mapping;10 11 namespace Northwind.Data12 13 public class NorthwindContext : DbContext14 15 public DbSet Categories get; set; 16 public DbSet Products get; set; 17 18 protected override void OnModelCreating(DbModelB
10、uilder 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
11、.Entities; 8 9 using System.Data.Entity;10 11 namespace Northwind.App12 13 class Program14 15 static void Main(string args)16 17 / 数据模型改变,删除数据库重新创建。18 Database.SetInitializer(new DropCreateDatabaseIfModelChanges();19 20 Category c = new Category() CategoryName = 电子数码 ;21 22 Product p = new Product()
12、 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 运行之后生成的数据
13、库结构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 / 11 / 产品ID12 / 13 public int ProductID get; set; 14 15 / 16 / 产品名称17 / 18 public string Product
14、Name get; set; 19 20 / 21 / 单价22 / 23 public decimal UnitPrice get; set; 24 25 / 26 / 库存27 / 28 public int UnitsInStock get; set; 29 30 / 31 / 是否售完32 / 33 public bool Discontinued get; set; 34 35 / 36 / 分类ID37 / 38 public int CategoryID get; set; 39 40 / 41 / 产品分类42 / 43 public virtual Category Cate
15、gory get; set; 44 45 运行之后生成的数据库中表结构如下:默认的外键规则:Target Type Key Name, Target Type Name + Target Type Key Name, 或者 NavigationProperty 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.Com
16、ponentModel.DataAnnotations; 7 8 namespace Northwind.Domain.Entities 9 10 public class Product11 12 / 13 / 产品ID14 / 15 public int ProductID get; set; 16 17 / 18 / 产品名称19 / 20 public string ProductName get; set; 21 22 / 23 / 单价24 / 25 public decimal UnitPrice get; set; 26 27 / 28 / 库存29 / 30 public i
17、nt UnitsInStock get; set; 31 32 / 33 / 是否售完34 / 35 public bool Discontinued get; set; 36 37 / 38 / 分类ID39 / 40 public int CategoryID get; set; 41 42 / 43 / 产品分类44 / 45 ForeignKey(CategoryID)46 public virtual Category Category get; set; 47 48 4、使用Fluent指定外键属性 1 using System; 2 using System.Collection
18、s.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.Mapping12 13 public class ProductMap : EntityTypeConfiguration14 15 public Product
19、Map()16 17 / Primary Key18 this.HasKey(t = t.ProductID);19 20 / Properties21 this.Property(t = t.ProductName).IsRequired().HasMaxLength(50);22 this.Property(t = t.UnitPrice).HasPrecision(18, 2);23 24 / Table & Column Mappings25 this.ToTable(dbo.Product);26 this.Property(t = t.ProductID).HasColumnNam
20、e(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).
21、HasColumnName(CategoryID);32 33 / Relationships34 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用户与角色多对多,一个用户可以属
22、于多个角色,一个角色可以有多个用户。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 / 11 / 用户ID12 / 13 public int UserID get; set; 14 15 / 16 / 用户名17 / 18 public string UserName get; set; 19
23、 20 / 21 / 密码22 / 23 public string Password get; set; 24 25 / 26 / 角色27 / 28 public ICollection 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 / 11 / 角色ID12
24、 / 13 public int RoleID get; set; 14 15 / 16 / 角色名称17 / 18 public string RoleName get; set; 19 20 / 21 / 用户22 / 23 public virtual ICollection 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.Mo
25、delConfiguration; 7 using System.ComponentModel.DataAnnotations; 8 9 using Northwind.Domain.Entities;10 11 namespace Northwind.Domain.Mapping12 13 public class UserMap : EntityTypeConfiguration14 15 public UserMap()16 17 / Primary Key18 this.HasKey(t = t.UserID);19 20 / Properties21 this.Property(t = t.UserName).IsRequired().HasMaxLength(50);22 this.Property(t = t.Password).IsRequired().HasMaxLength
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1