ASP.NET MVC 4 - 实体关系

本文关键字:实体 关系 NET MVC ASP | 更新日期: 2023-09-27 17:56:14

我正在MVC 4和Entity 5 CF中构建一个非常基本的站点,启动并运行了我的ViewModels,Automapper和通用DAL,除了我被困在这个问题上:

基本上,我有三张桌子;BlogPost,Tags(包含TagId和Name - 只是一个标签列表,例如C#,.NET,Ruby等)和EntryTags(BlogPostId和TagId - BlogPosts和相关标签的列表)。我创建了一个 ViewModel,它可以获取所有博客文章和相关标签,除了标签列表仅在每个博客旁边显示 EntryTag ID,我不确定如何以及在哪里将其链接到标签表以获取标签的名称。

我正在使用的模型示例:

博客文章模型:

public abstract class BlogPost
{
    [Key, DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int BlogPostId { get; set; }
    [Required, MaxLength(20)]
    public string Title { get; set; }
    [Required]
    public string Content { get; set; }
    [Required]
    public DateTime DateCreated { get; set; }
    [Required]
    public DateTime DateModified { get; set; }
    public virtual ICollection<EntryTag> EntryTags { get; set; }
}

标签型号:

[Table("Tag")]
public class Tag
{
    [Key, DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int TagId { get; set; }
    [Required]
    [MaxLength(20)]
    public string Name { get; set; }
}
[Table("EntryTag")]
public class EntryTag
{
    [Key, DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int EntryTagId { get; set; }
    [Required]
    public Entry Entry { get; set; }
    [Required]
    public Tag Tag { get; set; }
}

视图模型:

public class BlogIndexViewModel
{
    public int EntryId { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }
    public DateTime DateCreated { get; set; }
    public virtual ICollection<EntryTag> EntryTags { get; set; }
}

来自控制器的自动映射在模型和视图模型之间

IEnumerable<BlogPost> blogPosts = _genericRepository.GetAll();
IEnumerable<BlogIndexViewModel> viewModel = Mapper.Map<IEnumerable<BlogPost>, IEnumerable<BlogIndexViewModel>>(blogPosts);

和博客索引页面:

@Html.DisplayFor(modelItem => item.EntryTags)

ASP.NET MVC 4 - 实体关系

您必须

使用virtual navigation properties创建EntryTag

,如下所示。
[Table("EntryTag")]
public class EntryTag
{
    [Key, DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int EntryTagId { get; set; }
    [Required]
    public virtual Entry Entry { get; set; }
    [Required]
    public virtual Tag Tag { get; set; }
}