EFCodeFirst属性映射约定
EFCodeFirst属性映射约定
CodeFirst与数据表之间得映射方式又两种:Data Annotation和Fluent API
默认约定:
表名为类名的复数。
创建表得所有者为dbo。
int类型属性映射成数据库int类型。
string类型属性映射成数据库NVARCHAR类型。
若类的字符串类型属性未设置MaxLength,则生成对应的列类型为NVARCHAR(MAX)。
默认主键约束:属性名为[ID]或[类名 + ID]
对于int类型主键,会自动增长。
1 自定义映射表名以及所有者
Data Annotation
- //必要引用
- using System.ComponentModel.DataAnnotations.Schema;
- //映射表名
- [Table("Product")]
- public class Product
- //映射表名以及所有者
- [Table("Product", Schema = "dbo")]
- public class Product
Fluent API方式
- //重写OnModelCreating方法实现 映射表名
- protected override void OnModelCreating(DbModelBuilder modelBuilder)
- {
- modelBuilder.Entity<Product>().ToTable("Product");
- }
- //重写OnModelCreating方法实现 映射表名以及所有者
- protected override void OnModelCreating(DbModelBuilder modelBuilder)
- {
- modelBuilder.Entity<Product>().ToTable("Product", "dbo");
- }
2.字段名、长度、数据类型及是否可空
Data Annotation
- //映射列名
- [Column("ProductID")]
- public int ProductID { get; set; }
- //映射列名,长度,是否为空
- [MaxLength(100)]
- [Required, Column("ProductName")]
- public string ProductName { get; set; }
- //指定映射的数据类型
- [Column("UnitPrice", TypeName = "MONEY")]
- public decimal UnitPrice { get; set; }
- //设置Text
- [Column("Remark", TypeName = "text")]
- public string Remark { get; set; }
Fluent API方式
- protected override void OnModelCreating(DbModelBuilder modelBuilder)
- {
- //映射列名
- modelBuilder.Entity<Product>().Property(t => t.ProductID)
- .HasColumnName("ProductID");
- //映射列名,是否为空,最大长度
- modelBuilder.Entity<Product>().Property(t => t.ProductName)
- .IsRequired()
- .HasColumnName("ProductName")
- .HasMaxLength(100);
- }
- //指定映射的数据类型
- modelBuilder.Entity<Product>().Property(t => t.UnitPrice)
- .HasColumnName("UnitPrice")
- .HasColumnType("MONEY");
- //设置Text
- modelBuilder.Entity<Category>().Property(t => t.Remark)
- .HasColumnName("Remark")
- .HasColumnType("text");
3.主键
Data Annotation
- [Key]
- [Column("ProductID")]
- public int ProductID { get; set; }
Fluent API方式
- protected override void OnModelCreating(DbModelBuilder modelBuilder)
- {
- modelBuilder.Entity<Product>().HasKey(t => t.ProductID);
- }
- //多主键
- protected override void OnModelCreating(DbModelBuilder modelBuilder)
- {
- modelBuilder.Entity<Product>().HasKey(t => new { t.KeyID, t.CandidateID });
- }
4.数据库自动生成字段值
Data Annotation
- //取消int类型主键自动增长
- [Key]
- [Column("ProductID")]
- [DatabaseGenerated(DatabaseGeneratedOption.None)]
- public int ProductID { get; set; }
- [Key]
- [Column("CategoryID")]
- [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
- public int CategoryID { get; set; }
Fluent API方式
- //取消int类型主键自动增长
- protected override void OnModelCreating(DbModelBuilder modelBuilder)
- {
- modelBuilder.Entity<Product>().HasKey(t => t.ProductID);
- modelBuilder.Entity<Product>().Property(t => t.ProductID)
- .HasColumnName("ProductID")
- .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
- }
- modelBuilder.Entity<Category>().ToTable("Category", "dbo");
- modelBuilder.Entity<Category>().HasKey(t => t.CategoryID);
- modelBuilder.Entity<Category>().Property(t => t.CategoryID)
- .HasColumnName("CategoryID")
- .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
- }
5.数字类型长度及精度
Fluent API方式
- protected override void OnModelCreating(DbModelBuilder modelBuilder)
- {
- modelBuilder.Entity<Product>().Property(t => t.UnitPrice)
- .HasColumnName("UnitPrice")
- .HasPrecision(18, 2);
- }
6.非数据库字段属性
Data Annotation
- [NotMapped]
- public string Remark { get; set; }
Fluent API方式
- protected override void OnModelCreating(DbModelBuilder modelBuilder)
- {
- modelBuilder.Entity<Product>().Ignore(t => t.Remark);
- }
7.Fluent API配置Configuration映射类
方便维护
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
-
- using System.ComponentModel.DataAnnotations.Schema;
- using System.Data.Entity.ModelConfiguration;
-
- using Portal.Entities;
-
- namespace Portal.Mapping
- {
- public class ProductMap : EntityTypeConfiguration<Product>
- {
- public ProductMap()
- {
- // Primary Key
- this.HasKey(t => t.ProductID);
-
- // Properties
- this.Property(t => t.ProductID)
- .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
- this.Property(t => t.ProductName)
- .IsRequired()
- .HasMaxLength(100);
-
- // 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")
- .HasPrecision(18, 2);
- }
- }
- }
- protected override void OnModelCreating(DbModelBuilder modelBuilder)
- {
- modelBuilder.Configurations.Add(new ProductMap());
- }
只要心中有梦,不管什么天气都适合睡觉