Entity Framework Core使用笔记②

接上面本次创建的实.net api项目联合entityFrameWork项目

所以创建了.net core api项目模板

 接着对上次硬编码的数据库信息进行修改,将硬编码的地方消除

 同时,建立构造函数参数是DbcontextOption<>,他是Dbcontext的参数,构造函数是继承父类构造函数,options里的值是依赖注入进来的。

这时就需要区strartup.cs的ConfigureServices里去注册一下db连接

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext<MyContext>(
                options => {
                    options.UseMySql(Configuration.GetConnectionString("DefaultConnection"));    
                }
            );
            services.AddControllers();
        }

并且需要对appsettings.json应下配置文件

  "ConnectionStrings" :{
    "DefaultConnection": "Data Source = localhost; Port = 3306; Initial Catalog = mysql; user id = root; password = root;"
  }

同样试一下迁移

多对多关系

 这里试用一下多对对关系,假设一本书的作者可以是多个人,一个作者可以写多本书。

多对多还需要中间model让书和它形成一对多关系,让作者和他形成一对多关系

    public class BookAuthor
    {
        //自己的主键
        public int id { get; set; }

        //两个外键
        public int BookId{ get; set; }
        public int AuthorId { get; set; }

        //两个导航属性
        public Book Book{ get; set; }
        public Author Author { get; set; }
    }

修改下之前的书类

这里我将原来作者改成了书和中间类一对多关系

并且将时间datetime这个属性先不使用了,改成string,这里如果不是使用mysql,使用sqlsever可能就不会报错。

mysql这里如何处理我暂时就没去查资料了。

并且在构造函数那里初始化了list

   public class Book
    {
        //初始化BookAuthor
        public Book() {
            BookAuthors = new List<BookAuthor>();
        }
        public Guid Id { get; set; }
        public List<BookAuthor> BookAuthors { get; set; }
        public string BookName { get; set; }
        public String BookOnmarket { get; set; }
        public int SortId { get; set; }
        public Sort Sort { get; set; }
    }

添加作者类

作者类的思路和上面一样

    public class Author
    {
        public Author(){
            BookAuthors = new List<BookAuthor>(); 
        }
        public int id { get; set; }
        public string name { get; set; }
        public string age { get; set; }
        public List<BookAuthor> BookAuthors { get; set; }
    }

这时关系建立了,但是为了保证EFcore能够实现,在Context中明确写出两个主键

这个方法是指出主键的方法

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            //明确的指出联合主键
            modelBuilder.Entity<BookAuthor>().HasKey(x=>new { x.BookId,x.AuthorId});
        }

并在这个类里写出映射数据库的类BookAuthors,Authors

        public DbSet<BookAuthor> BookAuthors { get; set; }
        public DbSet<Author> Authors { get; set; }

一对一关系

这里再写出售价,写一个一对一关系

book.cs里添加

        public Price Price { get; set; }

创建Price.cs

id是主键,Bookid是外键

    public class Price
    {
        public int BookId { get; set; }
        public int Id { get; set; }
        public decimal RMB{ get; set; }
        public decimal Dollar { get; set; }
     public Book Book { get; set; } }

这里准备实现的关系是book存在,price不一定存在,price存在book一定存在。

 在mycontext里添加他们关系

  protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            //明确的指出联合主键
            modelBuilder.Entity<BookAuthor>().HasKey(x=>new { x.BookId,x.AuthorId});
            //明确最基础多对一关系书和中间类
            modelBuilder.Entity<BookAuthor>().HasOne(x => x.Book).WithMany(x => x.BookAuthors).HasForeignKey(x => x.BookId);
            //明确指出作者和中间类多对一
            modelBuilder.Entity<BookAuthor>().HasOne(x => x.Author).WithMany(x => x.BookAuthors).HasForeignKey(x => x.AuthorId);
            //一对一一关系
            modelBuilder.Entity<Price>().HasOne(x => x.Book).WithOne(x => x.Price).HasForeignKey<Price>(x=>x.BookId);
        }

最后生成表

原文地址:https://www.cnblogs.com/liuyang95/p/12927395.html