• CodeFirst Fluent API


    本文转自:疯狂的我  CodeFirst Fluent API

    EF的好处之一就是实现了概念模型和存储模型的分离,我们可以为概念实体和存储实体起不同的名称,同时还可以将一个概念实体映射到多个存储实体,实现实体之间一对多或多对多的关系。

    在CodeFirst里面为了处理这种概念实体和存储实体的对应关系,因此Fluent API就出现了。

    下面就开始介绍Fluent API

    先设置概念实体类

    public class Blog
    {
        public int Id { get; set; }
        public int BlogId { get; set; }
        public string Title { get; set; }
        public string BloggerName { get; set; }
        public string Test { get; set; }
        public virtual ICollection<Post> Posts { get; set; }
    }
     
    public class Post
    {
        public int Id { get; set; }
        public string Content { get; set; }
        public int FKBlogId { get; set; }
        public Blog Blog { get; set; }
        public ICollection<Comment> Comments { get; set; }
    }
     
    public class Comment
    {
        public int Id { get; set; }
        public string Content { get; set; }
        public ICollection<Post> Posts { get; set; }
    }

    第一步 创建类BlogContext 派生于 DbContext 重写里面的方法 OnModelCreating

    public class BlogContext : DbContext
       {
           public DbSet<Blog> Blogs { get; set; }
           public DbSet<Post> Posts { get; set; }
           public DbSet<Comment> Comments { get; set; }
           public DbSet<Supplier> Suppliers { get; set; }
            
           public class BlogContextInitializer : DropCreateDatabaseIfModelChanges<BlogContext>
           {
               protected override void Seed(BlogContext context)
               {
                   base.Seed(context);
               }
           }
     
           protected override void  OnModelCreating(DbModelBuilder modelBuilder)
           {         
               base.OnModelCreating(modelBuilder);
           }       
       }

      第二步 实现概念模型和存储模型之间的映射

    1、给表Blog设置主键

    注:如果没有给实体设置主键,那么EF会默认的设置ID或者[类名+ID]的列为主键,如果两个都存在,EF则会以ID为主键

    modelBuilder.Entity<Blog>().HasKey(c=>c.Id);

    2、概念实体映射到存储实体的实体名改变

    modelBuilder.Entity<Blog>().ToTable("Blog","Blogs");

    3、给存储模型设置别名,EF的强大之处在于概念模型和存储模型对应的字段的名称可以不一样,但它还能认识,我估计是以键对值的方式在存储别名

    modelBuilder.Entity<Blog>().Property(t => t.Test).HasColumnName("TestName");

    4、设置实体之间一对多的关系 同时指定了Blog的外键:FK_BlogId

    modelBuilder.Entity<Post>().HasRequired(p => p.Blog)
        .WithMany(b => b.Posts)
        .HasForeignKey(p => p.FK_BlogId);

    5、设置实体之间多对多的关系 实现多对多的关系是建立一张两表对应的关系表

      

    modelBuilder.Entity<Post>().HasMany(p => p.Comments)
        .WithMany(c => c.Posts).Map(mc =>
        {
            mc.ToTable("ComtentToPost");
            mc.MapRightKey("CommentId");
            mc.MapLeftKey("PostId");
        });

    6、设置存储实体的字段为非空类型

    modelBuilder.Entity<Blog>().Property(c => c.Title).IsRequired();

    7、设置字段长度

    modelBuilder.Entity<Blog>().Property(c => c.Title).HasMaxLength(12);

    8、设置字段类型

    modelBuilder.Entity<Blog>().Property(c => c.BloggerName).HasColumnType("varchar");

     这里列出了Fluent API 常用的几个。以后学习新东西的会坚持写博客,这样不仅对所学知识进行梳理,也能加强自身印象。

  • 相关阅读:
    Metasploit命令大全
    nmap所有参数详解
    Kali Linux 命令集
    十大编程算法助程序员走上大神之路
    新入行程序员需要知道的十个秘密
    浅谈c#枚举
    php 常用的系统函数
    php大型网站如何提高性能和并发访问
    【转】Oracle + PHP Cookbook(php oracle clob 长度超过4000如何写入)
    干货:小程序开发文档和设计指南要点详解
  • 原文地址:https://www.cnblogs.com/ashleyboy/p/3780075.html
Copyright © 2020-2023  润新知