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、數據庫關系圖


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM