zoukankan      html  css  js  c++  java
  • .Net Core(二)EFCore


    EFCore与之前的EF基本类似,区别在于配置的时候有一些差异;也取消了DB First和Model First,仅保留广泛使用的Code First模式;也不再支持LazyLoad。这里就感受一下其基本使用。

    一、EFCore的基本使用
    EFCore的Nuget包为Microsoft.EntityFrameworkCore,为了与Linux那边的Mysql连接还需安装provider,这里跟着安装了第三方的Pomelo.EntityFrameworkCore.Mysql。一开始不能用,后来发现两天前Pomelo刚刚发布了针对2.0的正式版,重新安装后就好了。
    在mysql添加表,然后配置好DbContext,简易代码为:

    public class MyDbContext : DbContext {
      public DbSet<Person> Persons { get; set; }

      protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) {
        base.OnConfiguring(optionsBuilder);
        optionsBuilder.UseMySql("Server=192.168.0.104;database=test1;uid=root;pwd=040207");
      }

      protected override void OnModelCreating(ModelBuilder modelBuilder) {
        base.OnModelCreating(modelBuilder);
        var etPerson = modelBuilder.Entity<Person>();
        etPerson.ToTable("T_Persons");
      }
    }

    重写了OnConfiguring和OnModelCreating以设置数据库连接和映射表。这里也是和EF区别的地方,后者是在config文件中配置连接字符串的。而且EF是需要手动禁用自动创建表和Migration的,这儿却没有类似的代码,具体后面再学习,Code First应该有这样的机制。
    最后测试添加数据的代码写法与EF完全一致。
    这次的C#代码采用了大括号不换行的风格,是因为发现这样的写法相对不占篇幅,而且便于作为文本复制。

    二、一对多和多对多
    a)一对多
    比如一个Author对应多本Book:

    //Book实体
    public class Book {
      public long ID { get; set; }
      public string Name { get; set; }
      public long AuthorID { get; set; }
      //导航属性
      public Author Author { get; set; }
    }
    ...
    //映射
    modelBuilder.Entity<Author>().ToTable("T_Authors");
    ...
    //一对多配置
    book.HasOne(a => a.Author).WithMany().HasForeignKey(a => a.AuthorID).IsRequired();
    ...
    //查询
    using Microsoft.EntityFrameworkCore;
    ...
    //Include
    var books = ctx.Books.Include(a => a.Author).First();

    Include放到了Microsoft.EntityFrameworkCore命名空间下。

    b)多对多
    角色权限是典型的多对多关系,比如User与Role。EFCore目前还不支持先EF那样直接的多对多配置,需要拆分为两个一对多,所以还要设置User与Role的中间表:

    public class UserRole {
      public long ID { get; set; }
      public long UserID { get; set; }
      public long RoleID { get; set; }
      public User User { get; set; }
      public Role Role { get; set; }
    }
    ...
    //两个一对多关系
    userRole.HasOne(a => a.User).WithMany().HasForeignKey(a => a.UserID).IsRequired();

    userRole.HasOne(a => a.Role).WithMany().HasForeignKey(a => a.RoleID).IsRequired();
    ...
    //查询
    var rel = ctx.UserRoles.Include(a=>a.Role).Where(r => r.UserID == userID);

    学习资料:如鹏网.net提高班http://www.rupeng.com/News/10/4603.shtml

  • 相关阅读:
    virtualbox结合nat和host-only设置固定ip的环境
    [zebra源码]流控设计
    [zebra源码]JdbcFilter过滤器和SPI扩展
    [zebra源码]如果数据库连接建立失败会怎样
    [zebra源码]insert后获取自增值的处理
    [zebra源码]GroupDataSource读库的负载均衡
    [zebra源码]不带分片键的sql会怎么执行?
    [zebra源码]如果定位到多个分库或分表怎么执行的?
    自定义类型hash
    spark on dataworks
  • 原文地址:https://www.cnblogs.com/zhixin9001/p/7487400.html
Copyright © 2011-2022 走看看