EF Code First一对一、一对多、多对多关联关系配置
1、EF Code First一对一关联关系
项目结构图:
实体类:
Account.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Northwind.App.Entities { public class Account { /// <summary> /// 账户ID /// </summary> public int AccountID { get; set; } /// <summary> /// 账户名 /// </summary> public string AccountName { get; set; } /// <summary> /// 密码 /// </summary> public string Password { get; set; } /// <summary> /// 用户信息 /// </summary> public virtual User User { get; set; } } }
User.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Northwind.App.Entities { public class Account { /// <summary> /// 账户ID /// </summary> public int AccountID { get; set; } /// <summary> /// 账户名 /// </summary> public string AccountName { get; set; } /// <summary> /// 密码 /// </summary> public string Password { get; set; } /// <summary> /// 用户信息 /// </summary> public virtual User User { get; set; } } }
实体映射类:
AccountMap.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.Entity.ModelConfiguration; using System.ComponentModel.DataAnnotations.Schema; using Northwind.App.Entities; namespace Northwind.App.Mapping { public class AccountMap : EntityTypeConfiguration<Account> { public AccountMap() { // Primary Key this.HasKey(t => t.AccountID); // Properties this.Property(t => t.AccountName).HasMaxLength(50); this.Property(t => t.Password).HasMaxLength(100); // Table & Column Mappings this.ToTable("Account"); this.Property(t => t.AccountID).HasColumnName("AccountID"); this.Property(t => t.AccountName).HasColumnName("AccountName"); this.Property(t => t.Password).HasColumnName("Password"); } } }
UserMap.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.Entity.ModelConfiguration; using System.ComponentModel.DataAnnotations.Schema; using Northwind.App.Entities; namespace Northwind.App.Mapping { public class UserMap : EntityTypeConfiguration<User> { public UserMap() { // Primary Key this.HasKey(t => t.AccountID); // Properties this.Property(t => t.AccountID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); this.Property(t => t.UserName).HasMaxLength(50); this.Property(t => t.Email).HasMaxLength(100); // Table & Column Mappings this.ToTable("User"); this.Property(t => t.AccountID).HasColumnName("AccountID"); this.Property(t => t.UserName).HasColumnName("UserName"); this.Property(t => t.Email).HasColumnName("Email"); this.Property(t => t.RegisterDate).HasColumnName("RegisterDate"); // Relationships this.HasRequired(t => t.Account) .WithRequiredDependent(t => t.User); } } }
NorthwindContext.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.Entity; using Northwind.App.Entities; using Northwind.App.Mapping; namespace Northwind.App { public class NorthwindContext : DbContext { static NorthwindContext() { Database.SetInitializer(new DropCreateDatabaseIfModelChanges<NorthwindContext>()); } public DbSet<Account> Accounts { get; set; } public DbSet<User> Users { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Configurations.Add(new AccountMap()); modelBuilder.Configurations.Add(new UserMap()); } } }
Program.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Northwind.App.Entities; namespace Northwind.App { class Program { static void Main(string[] args) { using (NorthwindContext db = new NorthwindContext()) { Account account = new Account { AccountName = "Test", Password = "1" }; db.Accounts.Add(account); User user = new User { AccountID = account.AccountID, UserName = "测试", Email = "test@126.com", RegisterDate = DateTime.Now }; db.Users.Add(user); db.SaveChanges(); } } } }
代码运行后生成的数据库结构图:
2、EF Code First一对多关联关系
关联表:Product 产品表、Category分类表
关联关系:一个产品属于一个分类,一个分类可以有多个产品
实体代码:
Category.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Northwind.App.Entities { public class Category { /// <summary> /// 分类ID /// </summary> public Guid CategoryID { get; set; } /// <summary> /// 分类名称 /// </summary> public string CategoryName { get; set; } /// <summary> /// 产品 /// </summary> public virtual ICollection<Product> Products { get; set; } } }
Product.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Northwind.App.Entities { public class Product { /// <summary> /// 产品ID /// </summary> public Guid ProductID { get; set; } /// <summary> /// 产品名称 /// </summary> public string ProductName { get; set; } /// <summary> /// 单价 /// </summary> public decimal UnitPrice { get; set; } /// <summary> /// 数量 /// </summary> public Nullable<int> Quantity { get; set; } /// <summary> /// 库存 /// </summary> public Nullable<int> UnitsInStock { get; set; } /// <summary> /// 产品类别ID /// </summary> public Guid CategoryID { get; set; } /// <summary> /// 产品类别 /// </summary> public virtual Category Category { get; set; } } }
实体映射类:
CategoryMap.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.Entity.ModelConfiguration; using System.ComponentModel.DataAnnotations.Schema; using Northwind.App.Entities; namespace Northwind.App.Mapping { public class CategoryMap : EntityTypeConfiguration<Category> { public CategoryMap() { // Primary Key this.HasKey(t => t.CategoryID); // Properties this.Property(t => t.CategoryID) .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); this.Property(t => t.CategoryName).IsRequired() .HasMaxLength(100); // Table & Column Mappings this.ToTable("Category"); this.Property(t => t.CategoryID).HasColumnName("CategoryID"); this.Property(t => t.CategoryName).HasColumnName("CategoryName"); } } }
ProductMap.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.Entity.ModelConfiguration; using System.ComponentModel.DataAnnotations.Schema; using Northwind.App.Entities; namespace Northwind.App.Mapping { public class ProductMap : EntityTypeConfiguration<Product> { public ProductMap() { // Primary Key this.HasKey(t => t.ProductID); // Properties this.Property(t => t.ProductID) .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); this.Property(t => t.ProductName).IsRequired() .HasMaxLength(100); this.Property(t => t.UnitPrice).HasPrecision(10, 2); // Table & Column Mappings this.ToTable("Product"); this.Property(t => t.ProductID).HasColumnName("ProductID"); this.Property(t => t.ProductName).HasColumnName("ProductName"); this.Property(t => t.UnitPrice).HasColumnName("UnitPrice"); this.Property(t => t.Quantity).HasColumnName("Quantity"); this.Property(t => t.UnitsInStock).HasColumnName("UnitsInStock"); this.Property(t => t.CategoryID).HasColumnName("CategoryID"); // Relationships this.HasRequired(t => t.Category) .WithMany(t => t.Products) .HasForeignKey(t => t.CategoryID) .WillCascadeOnDelete(false); } } }
NorthwindContext.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.Entity; using Northwind.App.Entities; using Northwind.App.Mapping; namespace Northwind.App { public class NorthwindContext : DbContext { static NorthwindContext() { Database.SetInitializer(new DropCreateDatabaseIfModelChanges<NorthwindContext>()); } public DbSet<Account> Accounts { get; set; } public DbSet<User> Users { get; set; } public DbSet<Category> Categories { get; set; } public DbSet<Product> Products { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Configurations.Add(new AccountMap()); modelBuilder.Configurations.Add(new UserMap()); modelBuilder.Configurations.Add(new CategoryMap()); modelBuilder.Configurations.Add(new ProductMap()); } } }
Program.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Northwind.App.Entities; namespace Northwind.App { class Program { static void Main(string[] args) { using (NorthwindContext db = new NorthwindContext()) { Category category = new Category { CategoryName = "手机数码" }; db.Categories.Add(category); Product product = new Product { CategoryID = category.CategoryID, ProductName = "IPhone5", UnitPrice = 5000m, Quantity = 100, UnitsInStock = 60 }; db.Products.Add(product); db.SaveChanges(); } } } }
运行代码后生成的数据表: