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();
            }
        }
    }
}

  运行代码后生成的数据表:

posted @ 2013-01-31 21:18  libingql  阅读(34435)  评论(9编辑  收藏  举报