zoukankan      html  css  js  c++  java
  • EFCodeFirst属性映射约定

    EFCodeFirst属性映射约定

    EFCodeFirst
    属性映射约定

    CodeFirst与数据表之间得映射方式又两种:Data Annotation和Fluent API
    默认约定:

    表名为类名的复数。
    创建表得所有者为dbo。

    int类型属性映射成数据库int类型。
    string类型属性映射成数据库NVARCHAR类型。
    若类的字符串类型属性未设置MaxLength,则生成对应的列类型为NVARCHAR(MAX)。

    默认主键约束:属性名为[ID]或[类名 + ID]

    对于int类型主键,会自动增长。

    1 自定义映射表名以及所有者

    Data Annotation

    1. //必要引用 
    2. using System.ComponentModel.DataAnnotations.Schema; 
    3. //映射表名 
    4. [Table("Product")] 
    5. public class Product 
    6. //映射表名以及所有者 
    7. [Table("Product", Schema = "dbo")] 
    8. public class Product 

    Fluent API方式

    1. //重写OnModelCreating方法实现 映射表名 
    2. protected override void OnModelCreating(DbModelBuilder modelBuilder) 

    3. modelBuilder.Entity<Product>().ToTable("Product"); 

    4. //重写OnModelCreating方法实现 映射表名以及所有者 
    5. protected override void OnModelCreating(DbModelBuilder modelBuilder) 

    6. modelBuilder.Entity<Product>().ToTable("Product", "dbo"); 

    2.字段名、长度、数据类型及是否可空

    Data Annotation

    1. //映射列名 
    2. [Column("ProductID")] 
    3. public int ProductID { get; set; } 
    4. //映射列名,长度,是否为空 
    5. [MaxLength(100)] 
    6. [Required, Column("ProductName")] 
    7. public string ProductName { get; set; } 
    8. //指定映射的数据类型 
    9. [Column("UnitPrice", TypeName = "MONEY")] 
    10. public decimal UnitPrice { get; set; } 
    11. //设置Text 
    12. [Column("Remark", TypeName = "text")] 
    13. public string Remark { get; set; } 

    Fluent API方式

    1. protected override void OnModelCreating(DbModelBuilder modelBuilder) 

    2. //映射列名 
    3. modelBuilder.Entity<Product>().Property(t => t.ProductID) 
    4. .HasColumnName("ProductID"); 
    5. //映射列名,是否为空,最大长度 
    6. modelBuilder.Entity<Product>().Property(t => t.ProductName) 
    7. .IsRequired() 
    8. .HasColumnName("ProductName"
    9.      .HasMaxLength(100); 

    10. //指定映射的数据类型 
    11. modelBuilder.Entity<Product>().Property(t => t.UnitPrice) 
    12. .HasColumnName("UnitPrice"
    13. .HasColumnType("MONEY"); 
    14. //设置Text 
    15. modelBuilder.Entity<Category>().Property(t => t.Remark) 
    16. .HasColumnName("Remark"
    17. .HasColumnType("text"); 

    3.主键

    Data Annotation

    1. [Key] 
    2. [Column("ProductID")] 
    3. public int ProductID { get; set; } 

    Fluent API方式

    1. protected override void OnModelCreating(DbModelBuilder modelBuilder) 

    2. modelBuilder.Entity<Product>().HasKey(t => t.ProductID); 

    3. //多主键 
    4. protected override void OnModelCreating(DbModelBuilder modelBuilder) 

    5. modelBuilder.Entity<Product>().HasKey(t => new { t.KeyID, t.CandidateID }); 

    4.数据库自动生成字段值

    Data Annotation

    1. //取消int类型主键自动增长 
    2. [Key] 
    3. [Column("ProductID")] 
    4. [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    5. public int ProductID { get; set; } 
    6. [Key] 
    7. [Column("CategoryID")] 
    8. [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    9. public int CategoryID { get; set; } 

    Fluent API方式

    1. //取消int类型主键自动增长 
    2. protected override void OnModelCreating(DbModelBuilder modelBuilder) 

    3. modelBuilder.Entity<Product>().HasKey(t => t.ProductID); 
    4. modelBuilder.Entity<Product>().Property(t => t.ProductID) 
    5. .HasColumnName("ProductID"
    6. .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); 

    7. modelBuilder.Entity<Category>().ToTable("Category", "dbo"); 
    8. modelBuilder.Entity<Category>().HasKey(t => t.CategoryID); 
    9. modelBuilder.Entity<Category>().Property(t => t.CategoryID) 
    10. .HasColumnName("CategoryID"
    11. .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 

    5.数字类型长度及精度

    Fluent API方式

    1. protected override void OnModelCreating(DbModelBuilder modelBuilder) 

    2. modelBuilder.Entity<Product>().Property(t => t.UnitPrice) 
    3. .HasColumnName("UnitPrice"
    4. .HasPrecision(18, 2); 

    6.非数据库字段属性

    Data Annotation

    1. [NotMapped] 
    2. public string Remark { get; set; } 

    Fluent API方式

    1. protected override void OnModelCreating(DbModelBuilder modelBuilder) 

    2. modelBuilder.Entity<Product>().Ignore(t => t.Remark); 

    7.Fluent API配置Configuration映射类

    方便维护

    1. using System; 
    2. using System.Collections.Generic; 
    3. using System.Linq; 
    4. using System.Text; 
    5.  
    6. using System.ComponentModel.DataAnnotations.Schema; 
    7. using System.Data.Entity.ModelConfiguration; 
    8.  
    9. using Portal.Entities; 
    10.  
    11. namespace Portal.Mapping 

    12. public class ProductMap : EntityTypeConfiguration<Product

    13. public ProductMap() 

    14. // Primary Key 
    15. this.HasKey(t => t.ProductID); 
    16.  
    17. // Properties 
    18. this.Property(t => t.ProductID) 
    19. .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); 
    20. this.Property(t => t.ProductName) 
    21. .IsRequired() 
    22. .HasMaxLength(100); 
    23.  
    24. // Table & Column Mappings 
    25. this.ToTable("Product"); 
    26. this.Property(t => t.ProductID).HasColumnName("ProductID"); 
    27. this.Property(t => t.ProductName).HasColumnName("ProductName"); 
    28. this.Property(t => t.UnitPrice) 
    29. .HasColumnName("UnitPrice"
    30. .HasPrecision(18, 2); 



    1. protected override void OnModelCreating(DbModelBuilder modelBuilder) 

    2. modelBuilder.Configurations.Add(new ProductMap()); 

  • 相关阅读:
    Python tutorial阅读之基本数据结构
    Leetcode:Merge Sorted Array
    Python tutorial阅读之函数的定义与使用
    LeetCode:3Sum
    Python tutorial阅读之Python基本运算与基本变量
    Python tutorial阅读之使用 Python 解释器
    LeetCode:Longest Substring Without Repeating Characters
    如何过好幸福且富裕的一生----查理芒格
    创业学习---《调研黑客上:锁定调研目标》--D-2.调研模块---HHR计划---以太一堂
    创业学习---《如何展开竞争情报调研》--D-1.调研模块---HHR计划---以太一堂
  • 原文地址:https://www.cnblogs.com/mmry/p/7060608.html
Copyright © 2011-2022 走看看