zoukankan      html  css  js  c++  java
  • EF Code-First 学习之旅 Code First Conventions

    协定是一系列的默认规则用来自动配置领域中的概念模型

    1:类型发现

      Code-First对包含DBSet属性的类型创建表(包括这些类型的所有引用类型)

      

    public class Student
    {
        public Student()
        { 
            
        }
        public int StudentID { get; set; }
        public string StudentName { get; set; }
        public DateTime DateOfBirth { get; set; }
        public byte[]  Photo { get; set; }
        public decimal Height { get; set; }
        public float Weight { get; set; }
            
        public Teacher Teacher { get; set; }
    
        public Standard Standard { get; set; }
    }
    
    public class Teacher
    {
        public Teacher()
        { 
            
        }
        public int TeacherId { get; set; }
        public string TeacherName { get; set; }
    }
        
    namespace EF_Code_First_Tutorials
    {
            
        public class SchoolContext: DbContext 
        {
            public SchoolContext(): base()
            {
                
            }
                
            public DbSet<Student> Students { get; set; }
            public DbSet<Standard> Standards { get; set; }
                
        }
    }

     上图所示:即使上下文不包含Teacher的实体集,Code-First也为Teacher创建表

    Code-First发现类型的协定:

    1)上下文中的DBSet属性类型

    2)引用的类型,即使在不同程序集中

    3)DBSet属性的子类

    主键约定

    默认是:属性名是Id或者是类名+id的属性作为主键

    主键的类型可以是任何类型,如果主键的数据类型为数字或者是GUID,则被配置为标识列

    如果定义主键为其他名字,则会抛出ModelValidationException 异常

    public class Standard
    {
        public Standard()
        { 
            
        }
        public int StdId { get; set; }
        public string StandardName { get; set; }
        
        public IList<Student> Students { get; set; }
       
        }

     Standard定义StdId为主键,EntityFramework会抛出异常

    'System.Data.Entity.ModelConfiguration.ModelValidationException' occurred in EntityFramework.dll
    EntityType 'Standard' has no key defined. Define the key for this EntityType.

    如果要定义StdId为主键,则需要DataAnnotations or Fluent API来配置主键


    关系约定

    Code First推断两个实体之间的关系用到导航属性

    导航属性可以是简单的引用类型或集合

    例如在Student中的导航属性为Standard,Standard中的导航属性为ICollection<Student>

    因此,Code First自动为Standard和Student建立一对多的关系

    在Student表中建立名为Standard_StandardId 的外键

    public class Student
    {
        public Student()
        { 
            
        }
        public int StudentID { get; set; }
        public string StudentName { get; set; }
        public DateTime DateOfBirth { get; set; }
        public byte[]  Photo { get; set; }
        public decimal Height { get; set; }
        public float Weight { get; set; }
            
        //Navigation property
        public Standard Standard { get; set; }
    }
    
    public class Standard
    {
        public Standard()
        { 
            
        }
        public int StandardId { get; set; }
        public string StandardName { get; set; }
        
        //Collection navigation property
        public IList<Student> Students { get; set; }
       
    }

    因此,Code First默认约定外键的名字为:<导航属性名>_<导航属性的主键>

    外键约定

    public class Student
    {
        public Student()
        { 
            
        }
        public int StudentID { get; set; }
        public string StudentName { get; set; }
        public DateTime DateOfBirth { get; set; }
        public byte[]  Photo { get; set; }
        public decimal Height { get; set; }
        public float Weight { get; set; }
            
        //Foreign key for Standard
        public int StandardId { get; set; }
    
        public Standard Standard { get; set; }
    }
    
    public class Standard
    {
        public Standard()
        { 
            
        }
        public int StandardId { get; set; }
        public string StandardName { get; set; }
        
        public IList<Student> Students { get; set; }
       
        }

    上面的例子中,Student类包含外键StandardId(Standard类的主键),Code First将在Students表中创建StandardId列名代替Standard_StandardId列

     上面的外键不可为null,因为int类型不是nullable

    如果定义为nullable,则可为null

    复杂类型约定

    Code-First默认的约定

    Default Convention ForDescription
    Table Name <实体类名> + 's' 
    EF will create DB table with entity class name suffixed by 's'
    Primary key Name 1) Id 
    2) <实体类名> + "Id" (忽略大小写) 

    EF will create primary key column for the property named Id or <Entity Class Name> + "Id" (case insensitive)
    Foreign key property Name By default EF will look for foreign key property with the same name as principal entity primary key name. 
    If foreign key property does not exists then EF will create FK column in Db table with <Dependent Navigation Property Name> + "_" + <Principal Entity Primary Key Property Name> 
    e.g. EF will create Standard_StandardId foreign key column into Students table if Student entity does not contain foreignkey property for Standard where Standard contains StandardId
    Null column 所有的引用类型列为null,基类型属性为nullable
    Not Null Column 主键属性为notnull,non-nullable
    DB Columns order 表中的列排序与实体中的属性排序是一样的,不过主键会被移到首位
    Properties mapping to DB 所有的属性都被映射到列中,使用[NotMapped]特性排除属性或列不进行映射
    Cascade delete Enabled By default for all types of relationships.

     C#中的数据类型与表中的数据类型对应关系

    C# DataTypeRelated DB Column DataTypePK Column DataType & Length
    int int int, Identity column increment by 1
    string nvarchar(Max) nvarchar(128)
    decimal decimal(18,2) decimal(18,2)
    float real real
    byte[] varbinary(Max) varbinary(128)
    datetime datetime datetime
    bool bit bit
    byte tinyint tinyint
    short smallint smallint
    long bigint bigint
    double float float
    char No mapping No mapping
    sbyte No mapping 
    (throws exception)
    No mapping
    object No mapping No mapping
  • 相关阅读:
    day35-python-网络编程
    oc-继承(inherit) 方法重写 继承与组合
    oc-self关键字
    oc-类方法
    oc-封装 get set方法
    oc-匿名对象
    oc-函数命名
    oc-函数,方法,类
    解决"authentication token manipulation error"
    让tomcat自动定位到项目
  • 原文地址:https://www.cnblogs.com/lanpingwang/p/6624462.html
Copyright © 2011-2022 走看看