2

我有 3 个实体,我正在尝试在它们之间创建映射。

[Table("ContentItem")]
public class ContentItem
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ID { get; set; }

    public virtual Page Page { get; set; }

    [Column("PageID")]
    public int PageID { get; set; }

    public virtual ContentType ContentType { get; set; }

    [Column("ContentTypeID")]
    public int ContentTypeID { get; set; }

    public int ItemID { get; set; }
}

[Table("ContentType")]
public class ContentType
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ID { get; set; }

    public string Name { get; set; }

    [ForeignKey("ID")]
    public virtual HTMLContent HtmlContent { get; set; }    
 }

[Table("HTMLContent")]
public class HTMLContent
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [Column("ID")]
    public int ID { get; set; }

    public string Content { get; set; }

    public int SortOrder { get; set; }

    [Column("PageID")]
    public int PageID { get; set; }

    [Column("ContentTypeID")]
    public int ContentTypeID { get; set; }

    public virtual ContentType ContentType { get; set; }
}

我目前使用 Fluent API 映射了 ContentType 和 HTMLContent 之间的关系,如下所示:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    // http://weblogs.asp.net/shijuvarghese/archive/2011/10/06/removing-edmmetadata-table-in-ef-code-first.aspx
    // We don't need the EdmMetadata table in the DB
    modelBuilder.Conventions.Remove<IncludeMetadataConvention>();

    modelBuilder.Entity<ContentType>().HasRequired(b => b.HtmlContent);

}

现在使用 Linq 访问 HTMLContent,如下所示:

var contentItems = cmsUnitOfWork.ContentItems.Find().Where(x => x.PageID == 1).ToList();

我可以在我的视图中访问 HTMLContent:

@model IEnumerable<H2O.Domain.CMS.Models.ContentItem>

@foreach(var x in Model)
{
    <div id="ContentItem@(x.ID)">
    <strong>@x.ContentType.HtmlContent.Content
    </div>
}

但是,它只给了我数据库中的第一个 HTMLContent 行。我希望它返回 ID 对应于 ContentItem 实体中的 ItemID 成员的 HTMLContent。由于 ItemID 可能来自 HTMLContent 以外的其他 ID,因此我无法映射直接外键。我怎样才能用实体做到这一点?

4

1 回答 1

0

我自己是这个 MVC 的新手,但我想我可以看到你需要做什么。您可能想查看创建视图模型。与其尝试访问我还没有想到的 MVC 中的嵌套对象,不如构建一个针对您的特定需求量身定制的类。

像这样的东西:-

 public class ViewHtmContentAndContentItem
    {
      public ContentItem contentItems {get; set;}
      public HTMLContent HtmlContentItems {get; set;}
    }

现在,当您执行 Linq 查询时,您可以在两个表中加入两个PageId表并将此对象返回到您的视图。

在那里您可以访问您需要的任何属性。

希望这可以帮助。

于 2012-12-24T21:02:00.423 回答