zoukankan      html  css  js  c++  java
  • ASP.NET EntityFrameworkCore code first 多对多设计

    参考网址:https://docs.microsoft.com/zh-cn/ef/core/get-started/full-dotnet/new-db

    场景:使用ASP.NET EntityFrameworkCore CODE FIRST 创建多对多实体

    需求:CODE FIRST实现多对多的实体创建。

    细节:

    创建两个实体类,一个是AppUser,一个是AppRole,两个实体通过UserRole关联。即一个AppUser可能隶属于多个AppRole,一个AppRole可能关联了多个AppUser。

    在EntityFrameworkCore 中,不支持两个实体之间的直接多对多,可以通过引入第三个实体,分别进行两次一对多来间接实现多对多。

    官方描述为:

    Many-to-many relationships without an entity class to represent the join table are not yet supported. However, you can represent a many-to-many relationship by including an entity class for the join table and mapping two separate one-to-many relationships.

    步骤:

    1.使用VS2017创建项目;

    2.NuGet添加 Microsoft.EntityFrameworkCore.SqlServer

    3.创建如下三个类

     public class AppUser
        {
    
            public int AppUserID { get; set; }
            public string Guid { get; set; }
    
            public string UserName { get; set; }
            public string LoginName { get; set; }
            public string LoginPassword { get; set; }
            public string Phone { get; set; }
            public string Email { get; set; }
            public int Sex { get; set; }
    
            
            public int BranchOfficeID { get; set; }
            public BranchOffice BranchOffice { get; set; }
    
            public List<UserRole> UserRoles { get; set; }
    
    
        }
    AppUser 类
     public class AppRole
        {
            public int AppRoleID { get; set; }
            public string Guid { get; set; }
            public string RoleName { get; set; }
    
           public List<UserRole> UserRoles { get; set; }
        }
    AppRole类
     public class UserRole
        {
            public int UserRoleID { get; set; }
    
    
            public int AppRoleID { get; set; }
            public AppRole AppRole { get; set; }
    
    
            public int AppUserID { get; set; }
            public AppUser AppUser { get; set; }
        }
    UserRole类

    4.创建DBContext

     public class ApiContext:DbContext
        {
          
            public DbSet<AppUser> AppUsers { get; set; }
    
            public DbSet<AppRole> AppRoles { get; set; }
    
            public DbSet<UserRole> UserRoles { get; set; }
    
    
            /// <summary>
            /// 通过第三张表UserRole 实现 多对多绑定 AppRole 和 AppUser
            /// </summary>
            /// <param name="modelBuilder"></param>
            protected override void OnModelCreating(ModelBuilder modelBuilder)
            {
                modelBuilder.Entity<UserRole>()
                    .HasKey(t => new { t.AppRoleID, t.AppUserID });
    
                modelBuilder.Entity<UserRole>()
                            .HasOne(userrole => userrole.AppUser)
                            .WithMany(user => user.UserRoles)
                            .HasForeignKey(userrole => userrole.AppUserID);
    
                modelBuilder.Entity<UserRole>()
                            .HasOne(userrole => userrole.AppRole)
                            .WithMany(role => role.UserRoles)
                            .HasForeignKey(userrole=> userrole.AppRoleID);
            }
    
    
            protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
            {
                optionsBuilder.UseSqlServer(@"Server=sandbox.XXXX.com;Initial Catalog=API;Persist Security Info=True;User ID=sa;Password=XXXXX;");
            }
        }
    DbContext类

    5.运行 Add-Migration APIMigration 

    运行结束后,可以发现项目中多了 APIMigration.cs

    6.运行Update-Database,生成数据库。

    检查数据库生成结果:

     

    检查UserRoles表的外键:

    至此,创建多对多的实体成功。

  • 相关阅读:
    C# 下 WebService 初探: 构建Web Service 服务及 WinForm和浏览器 httpget调用
    Action<T> 泛型委托 在跨线程访问控件委托中的应用
    C# 网络连接中异常断线的处理:ReceiveTimeout, SendTimeout 及 KeepAliveValues(设置心跳)
    DOS下的批处理文件(老东西了)
    typedef struct和struct定义结构体的区别
    多线程idhttp下载文件源代码
    JQUERY获取DOM对象
    学习笔记:delphi实现网络通信之select模型
    学习笔记之WSAAsyncSelect模式
    delphi 函数指针 方法指针
  • 原文地址:https://www.cnblogs.com/shuzhenyu/p/6561852.html
Copyright © 2011-2022 走看看