شروع به کار با EF Core 1.0 - قسمت 8 - بررسی رابطهی Many-to-Many
نویسنده: وحید نصیری
تاریخ: ۱۳۹۵/۰۶/۰۳ ۱۲:۵۰
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
public class Tags
{
public Tags()
{
BlogPostsJoinTags = new HashSet<BlogPostsJoinTags>();
}
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<BlogPostsJoinTags> BlogPostsJoinTags { get; set; }
} public class BlogPostsJoinTags
{
public virtual BlogPosts BlogPost { get; set; }
public int BlogPostId { get; set; }
public virtual Tags Tag { get; set; }
public int TagId { get; set; }
} public class BlogPosts
{
public BlogPosts()
{
BlogPostsJoinTags = new HashSet<BlogPostsJoinTags>();
}
public int Id { get; set; }
public string Title { get; set; }
public string Body { get; set; }
public virtual ICollection<BlogPostsJoinTags> BlogPostsJoinTags { get; set; }
} public class MyDBDataContext : DbContext
{
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(@"Data Source=(local);Initial Catalog=testdb2;Integrated Security = true");
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<BlogPosts>(entity =>
{
entity.Property(e => e.Title)
.IsRequired()
.HasMaxLength(450);
});
modelBuilder.Entity<Tags>(entity =>
{
entity.Property(e => e.Name)
.IsRequired()
.HasMaxLength(450);
});
modelBuilder.Entity<BlogPostsJoinTags>(entity =>
{
entity.HasKey(e => new { e.TagId, e.BlogPostId })
.HasName("PK_dbo.BlogPostsJoinTags");
entity.HasIndex(e => e.BlogPostId)
.HasName("IX_BlogPostId");
entity.HasIndex(e => e.TagId)
.HasName("IX_TagId");
entity.HasOne(d => d.BlogPost)
.WithMany(p => p.BlogPostsJoinTags)
.HasForeignKey(d => d.BlogPostId)
.HasConstraintName("FK_dbo.BlogPostsJoinTags_dbo.BlogPosts_BlogPostId");
entity.HasOne(d => d.Tag)
.WithMany(p => p.BlogPostsJoinTags)
.HasForeignKey(d => d.TagId)
.HasConstraintName("FK_dbo.BlogPostsJoinTags_dbo.Tags_TagId");
});
}
public virtual DbSet<BlogPosts> BlogPosts { get; set; }
public virtual DbSet<BlogPostsJoinTags> BlogPostsJoinTags { get; set; }
public virtual DbSet<Tags> Tags { get; set; }
} public class Tags
{
public Tags()
{
BlogPostsJoinTags = new HashSet<BlogPostsJoinTags>();
}
public int Id { get; set; }
[Required]
[MaxLength(450)]
public string Name { get; set; }
[InverseProperty("Tag")]
public virtual ICollection<BlogPostsJoinTags> BlogPostsJoinTags { get; set; }
} public class BlogPostsJoinTags
{
[ForeignKey("BlogPostId")]
[InverseProperty("BlogPostsJoinTags")]
public virtual BlogPosts BlogPost { get; set; }
public int BlogPostId { get; set; }
[ForeignKey("TagId")]
[InverseProperty("BlogPostsJoinTags")]
public virtual Tags Tag { get; set; }
public int TagId { get; set; }
} public class BlogPosts
{
public BlogPosts()
{
BlogPostsJoinTags = new HashSet<BlogPostsJoinTags>();
}
public int Id { get; set; }
[Required]
[MaxLength(450)]
public string Title { get; set; }
public string Body { get; set; }
[InverseProperty("BlogPost")]
public virtual ICollection<BlogPostsJoinTags> BlogPostsJoinTags { get; set; }
} public class MyDBDataContext : DbContext
{
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(@"Data Source=(local);Initial Catalog=testdb2;Integrated Security = true");
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<BlogPostsJoinTags>(entity =>
{
entity.HasKey(e => new { e.TagId, e.BlogPostId })
.HasName("PK_dbo.BlogPostsJoinTags");
entity.HasIndex(e => e.BlogPostId)
.HasName("IX_BlogPostId");
entity.HasIndex(e => e.TagId)
.HasName("IX_TagId");
});
}
public virtual DbSet<BlogPosts> BlogPosts { get; set; }
public virtual DbSet<BlogPostsJoinTags> BlogPostsJoinTags { get; set; }
public virtual DbSet<Tags> Tags { get; set; }
} var post = new BlogPosts { ... };
context.BlogPosts.Add(post);
var tag = new Tags { ... };
context.Tags.Add(tag);
var postTag = new BlogPostsJoinTags { Tag = tag, BlogPost = post };
context.PostsTags.Add(postTag);
context.SaveChanges(); BlogPosts post1 = this.BlogPosts
.Include(blogPosts => blogPosts.BlogPostsJoinTags)
.ThenInclude(joinTags => joinTags.Tag)
.First(blogPosts => blogPosts.Id == 1);
IEnumerable<Tags> post1Tags = post1.BlogPostsJoinTags.Select(x => x.Tag); BlogPosts post1 = this.BlogPosts
.Include(blogPosts => blogPosts.BlogPostsJoinTags)
.ThenInclude(joinTags => joinTags.Tag)
.First(blogPosts => blogPosts.Id == 1);
IEnumerable<Tags> post1Tags = post1.BlogPostsJoinTags.Select(x => x.Tag); .First(blogPosts => blogPosts.Id == 1);
var post1Tags = context.BlogPosts .Where(blogPosts => blogPosts.Id == 1) .SelectMany(blogPosts => blogPosts.BlogPostsJoinTags) .Select(blogPostsJoinTags => blogPostsJoinTags.Tag) .Skip(0) .Take(10) .ToList();
SELECT [blogPosts.BlogPostsJoinTags.Tag].[Id], [blogPosts.BlogPostsJoinTags.Tag].[Name] FROM [BlogPosts] AS [blogPosts] INNER JOIN [BlogPostsJoinTags] AS [blogPosts.BlogPostsJoinTags] ON [blogPosts].[Id] = [blogPosts.BlogPostsJoinTags].[BlogPostId] INNER JOIN [Tags] AS [blogPosts.BlogPostsJoinTags.Tag] ON [blogPosts.BlogPostsJoinTags].[TagId] = [blogPosts.BlogPostsJoinTags.Tag].[Id] WHERE [blogPosts].[Id] = 1 ORDER BY @@ROWCOUNT OFFSET @__p_0 ROWS FETCH NEXT @__p_1 ROWS ONLY;
class CustomerConfiguration : IEntityTypeConfiguration<Customer>
{
public void Configure(EntityTypeBuilder<Customer> builder)
{
builder.HasKey(c => c.AlternateKey);
builder.Property(c => c.Name).HasMaxLength(200);
}
}
...
// OnModelCreating
builder.ApplyConfiguration(new CustomerConfiguration()); [EntityTypeConfiguration(typeof(CustomerConfiguration))]
public class Customer
{
} public class PostConfiguration : IEntityTypeConfiguration<Post>
{
public void Configure(EntityTypeBuilder<Post> builder)
{
builder.HasMany(post => post.Tags)
.WithMany(tag => tag.Posts)
.UsingEntity(join => join.ToTable("PostsTags"));
}
}