• EntityFramework之多对多关系(四)


    上篇介绍了一对多关系,下面介绍下多对多关系代码编写。

    1、新建model实体,User是用户类,Role是角色类,由于是多对多关系,必须得有一个中间类,所以产生了UserRole类

     1     public class User
     2     {
     3         public int Id { get; set; }
     4         public string Name { get; set; }
     5 
     6         public virtual ICollection<UserRole> UserRoles { set; get; }
     7     }
     8 
     9     public class Role
    10     {
    11         public int Id { get; set; }
    12         public string Name { get; set; }
    13 
    14         public virtual ICollection<UserRole> UserRoles { set; get; }
    15     }
    16 
    17     public class UserRole
    18     {
    19         public int Id { get; set; }
    20         public int UId { get; set; }
    21         public int RId { get; set; }
    22 
    23         public virtual User User { set; get; }
    24         public virtual Role Role { set; get; }
    25     }

     2、创建一个EntityContext并继承自DbContext

     1     public class EntityContext : DbContext
     2     {
     3         public EntityContext()
     4             : base("name=DBConnectionString")
     5         {
     6 
     7         }
     8 
     9         public DbSet<User> User { get; set; }
    10         public DbSet<Role> Role { get; set; }
    11         public DbSet<UserRole> UserRole { get; set; }
    12 
    13         protected override void OnModelCreating(DbModelBuilder modelBuilder)
    14         {
    15             modelBuilder.Configurations.AddFromAssembly(Assembly.GetExecutingAssembly());
    16             base.OnModelCreating(modelBuilder);
    17         }
    18     }

     3、在web.config文件中添加数据库连接字符串

    1   <connectionStrings>
    2     <add name="DBConnectionString" connectionString="Data Source=.;Initial Catalog=ManyToMany;Integrated Security=true" providerName="System.Data.SqlClient" />
    3   </connectionStrings>

     4、接着创建实体映射

     1     public class UserMap : EntityTypeConfiguration<User>
     2     {
     3         public UserMap()
     4         {
     5             ToTable("User");
     6             HasKey(u => u.Id);
     7         }
     8     }
     9 
    10     public class RoleMap : EntityTypeConfiguration<Role>
    11     {
    12         public RoleMap()
    13         {
    14             ToTable("Role");
    15             HasKey(r => r.Id);
    16         }
    17     }
    18 
    19     public class UserRoleMap : EntityTypeConfiguration<UserRole>
    20     {
    21         public UserRoleMap()
    22         {
    23             ToTable("UserRole");
    24             HasKey(ur => ur.Id);
    25 
    26             //WillCascadeOnDelete:不使用级联删除
    27             HasRequired(pt => pt.User).WithMany(p => p.UserRoles).HasForeignKey(pt => pt.UId).WillCascadeOnDelete(false);
    28 
    29             HasRequired(pt => pt.Role).WithMany(t => t.UserRoles).HasForeignKey(pt => pt.RId).WillCascadeOnDelete(false);
    30         }
    31     }

     5、我们写一些操作,让Code First生成数据库并验证数据是否新增

     1     var user = new User() { Name = "Bob" };
     2     db.Set<User>().Add(user);
     3 
     4     var role = new Role() { Name = "admin" };
     5     db.Set<Role>().Add(role);
     6 
     7     db.SaveChanges();
     8 
     9     var ur = new UserRole() { RId = role.Id, UId = user.Id };
    10     db.Set<UserRole>().Add(ur);
    11     db.SaveChanges();
    12 
    13     //var list = db.Set<User>().Include("UserRoles").ToList();
    14     //如果需要查出UserRoles下的Role可以这样
    15     //避免通过延迟加载需要访问数据库(同样的外键实体只会访问一次,但是比较多的话还是用以下方式)
    16     var list = db.Set<User>().Include("UserRoles.Role").ToList();

     6、数据库关系图

  • 相关阅读:
    [原]小巧的刀片
    [原]看康震教授讲《卖油翁》有感
    [原]使用可传输表空间修改Schema Name
    [原]ORA00060: Deadlock detected(场景1:单表并发更新)
    [原]使用wget/curl做个“小后门”
    [原]一个空格导致NFS的Readonly
    [转]设计高效SQL: 一种视觉的方法
    [原]6Gb/s SAS 2.0 通道的确不错
    ESX 4/VSphere CentOS 启动时 udev Hang 住
    [摘]终于找到一个有助理解left/right/full outer join的例子
  • 原文地址:https://www.cnblogs.com/zuqing/p/5452356.html
Copyright © 2020-2023  润新知