Как можно объединить две таблицы в Entity Framework Core и передать их в View? - PullRequest
0 голосов
/ 26 апреля 2020

У меня в ViewModel есть содержимое, которое будет отображаться в индексе. Этими моделями являются:

  • Config (Настройки веб-сайта)
  • Новости (основное содержимое)
  • Категории (На данный момент каждая новость связана с одной категорией. Я не мог не делайте так, чтобы их можно было связать со многими категориями.)
  • Авторы (Каждая новость, естественно, имеет автора.)
  • Теги ( Указанный тег может принадлежать какому-либо отдельная новость или может принадлежать многим новостям. Итак, я создал для этого класс. )
  • Комментарии (Я в порядке с этим.)

Что я ' У меня проблема в том, чтобы показать новости с тегами, связанными только с самими новостями.

Мои коды:

Мой HomeController:

public class HomeController : Controller
    {
        private readonly DatabaseContext _context;
        public HomeController(DatabaseContext context)
        {
            this._context = context;
        }
        public ActionResult Index(int page = 1)
        {
            var recordsPerPage = (from a in _context.Config where a.RecordsPerPage != null select a.RecordsPerPage).First();

            HomeViewModel model = new HomeViewModel
            {
                Configs = (from a in _context.Config select a).ToList(),
                News = (from a in _context.News select a).ToList().ToPagedList(page, (int)recordsPerPage),
                Categories = (from a in _context.Categories select a).ToList(),
                Authors = (from a in _context.Authors select a).ToList(),
                Tags = (from i in _context.News
                        join c in _context.TagNews
                        on i.NewsID equals c.NewsID
                        join e in _context.Tags
                        on c.TagID equals e.TagID
                        where c.NewsID==i.NewsID
                        select
                        new Tags {
                        Tag = e.Tag
                        }).ToList(),
                Comments = (from a in _context.Comments select a).ToList()
            };

            return View(model);
        }
    }

Мои теги.cs :

public class Tags
    {
        [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int TagID { get; set; }
        public string Tag { get; set; }
        public virtual ICollection<TagsNews> TagNews { get; set; } = new List<TagsNews>();
    }

My News.cs

[Table("News")]
    public class News
    {
        [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int NewsID { get; set; }
        [StringLength(150), Required]
        public string NewsTitle { get; set; }
        [StringLength(4000), Required]
        public string NewsBody { get; set; }
        [Required]
        public Nullable<int> NewsViewCount { get; set; }
        [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
        [DataType(DataType.Date)]
        [Required]
        public DateTime PublishDate { get; set; }
        public string ImageURL { get; set; }
        public bool IsActive { get; set; }


        //Navigation Properties
        public virtual Categories Category { get; set; }
        public virtual Authors Author { get; set; }
        public virtual ICollection<TagsNews> TagsNew { get; set; } = new List<TagsNews>();
        public virtual List<Comments> Comment { get; set; } = new List<Comments>();

    }

My TagNews.cs

public class TagsNews
    {
        public int NewsID { get; set; }
        public News News { get; set; }
        public Tags Tags { get; set; }
        public int TagID { get; set; }
    }

my View:

@foreach (var news in Model.News)
{
    {
        if (news.NewsBody.Length > 600)
        {
            <text>
                @news.NewsBody.Substring(0, 600) ... <a href="blog-post.html" class="btn btn-xs btn-light text-1 text-uppercase text-color-tertiary">Read More</a>
            </text>
        }
        else
        {
            <text>
                @news.NewsBody
            </text>
        }
    }
    @foreach (var tags in Model.Tags)
    {
        <span><i class="fa fa-tag"></i> <a href="#" class="text-success">@tags.Tag</a></span>
    }
}

My DatabaseContext :

public class DatabaseContext : DbContext
    {
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlServer(@"Server=.\SQLEXPRESS;Database=TheNews;Integrated Security=True;").EnableSensitiveDataLogging();
        }
        public DatabaseContext(DbContextOptions<DatabaseContext> options) : base(options)
        {
        }
        public DbSet<News> News { get; set; }
        public DbSet<Categories> Categories { get; set; }
        //public DbSet<NewsCategory> NewsCategories { get; set; }
        //public DbSet<AuthorNews> AuthorNew { get; set; }
        //public DbSet<CommentNew> CommentNews { get; set; }
        public DbSet<TagsNews> TagNews { get; set; }
        public DbSet<Config> Config { get; set; }
        public DbSet<Authors> Authors { get; set; }
        public DbSet<Tags> Tags { get; set; }
        public DbSet<Comments> Comments { get; set; }
        public override int SaveChanges(bool acceptAllChangesOnSuccess)
        {
            var serviceProvider = this.GetService<IServiceProvider>();
            var items = new Dictionary<object, object>();
            foreach (var entry in this.ChangeTracker.Entries().Where(e => (e.State == EntityState.Added) || (e.State == EntityState.Modified)))
            {
                var entity = entry.Entity;
                var context = new ValidationContext(entity, serviceProvider, items);
                var results = new List<ValidationResult>();
                if (Validator.TryValidateObject(entity, context, results, true) == false)
                {
                    foreach (var result in results)
                    {
                        if (result != ValidationResult.Success)
                        {
                            throw new ValidationException(result.ErrorMessage);
                        }
                    }
                }
            }
            return base.SaveChanges(acceptAllChangesOnSuccess);
        }
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);

            for (int i = 1; i < 4; i++)
            {
                modelBuilder.Entity<Authors>().HasData(new Authors
                {
                    AuthorID = i,
                    AuthorEmail = FakeData.NetworkData.GetEmail(FakeData.NameData.GetFirstName(), FakeData.NameData.GetSurname()),
                    AuthorUsername = FakeData.NameData.GetFirstName() + FakeData.NameData.GetSurname(),
                    AuthorPassword = FakeData.TextData.GetAlphaNumeric(8)
                });
                modelBuilder.Entity<News>().HasData(new News
                {
                    NewsID = i,
                    NewsBody = FakeData.TextData.GetSentences(1),
                    NewsTitle = FakeData.TextData.GetSentences(1),
                    NewsViewCount = FakeData.NumberData.GetNumber(1, 10),
                    PublishDate = FakeData.DateTimeData.GetDatetime(),
                    IsActive = true,
                    ImageURL = FakeData.NetworkData.GetDomain()
                });
                modelBuilder.Entity<Categories>().HasData(new Categories
                {
                    CategoryID = i,
                    CategoryName = FakeData.TextData.GetAlphaNumeric(20),
                    CategoryDescription = FakeData.TextData.GetSentences(1)
                });
                modelBuilder.Entity<Comments>().HasData(new Comments
                {
                    CommentID = i,
                    CommentBody = FakeData.TextData.GetSentences(1)
                });
                modelBuilder.Entity<Tags>().HasData(new Tags
                {
                    TagID = i,
                    Tag = FakeData.TextData.GetAlphabetical(8)
                });

                modelBuilder.Entity<TagsNews>().HasData(new TagsNews { TagID = i, NewsID = i });
                //modelBuilder.Entity<CommentNew>().HasData(new CommentNew { CommentID = i, NewsID = i });
                //modelBuilder.Entity<NewsCategory>().HasData(new NewsCategory { CategoryID = i, NewsID = i });
                //modelBuilder.Entity<AuthorNews>().HasData(new AuthorNews { AuthorID = i, NewsID = i });
            }
            modelBuilder.Entity<Config>().HasData(new Config { ID = 1, WebSiteAddress = "http://localhost", Description = "lorem ipsum", Keywords = "keyword,keyword2", RecordsPerPage = 10 });

            //modelBuilder.Entity<NewsCategory>().HasKey(sc => new { sc.CategoryID, sc.NewsID });
            //modelBuilder.Entity<AuthorNews>().HasKey(sc => new { sc.NewsID, sc.AuthorID });
            //modelBuilder.Entity<CommentNew>().HasKey(sc => new { sc.NewsID, sc.CommentID });
            modelBuilder.Entity<TagsNews>().HasKey(sc => new { sc.NewsID, sc.TagID });

        }

В этой версии я могу показывать новости по указателю. Также я могу показать теги, но они (все теги, даже не связанные с самими новостями) появляются под самими новостями.

Надеюсь, я смог объяснить четко. Я думаю, что я делаю что-то не так с запросом SQL в HomeController или с ключами.

С уважением.

...