У меня в 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 или с ключами.
С уважением.