在 3 个实体之间创建导航属性

Posted

技术标签:

【中文标题】在 3 个实体之间创建导航属性【英文标题】:Creating navigation property between 3 entities 【发布时间】:2012-12-11 02:41:12 【问题描述】:

我尝试在 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 =&gt; 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,因此我无法映射直接外键。如何使用 Entity 做到这一点?

【问题讨论】:

我对你的例子有点困惑,你打算在 ContentType 和 HtmlContent 之间建立 1:1 的关系吗? 【参考方案1】:

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

类似这样的:-

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

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

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

希望这会有所帮助。

【讨论】:

以上是关于在 3 个实体之间创建导航属性的主要内容,如果未能解决你的问题,请参考以下文章

如何在实体框架模型中使用通用导航属性?

无法获取要更新实体框架中导航属性的关系

在导航属性实体框架上正确使用接口

两个日期之间实体属性的核心数据总和

如何首先使用实体​​框架 5 代码删除具有导航属性的对象?

UINavigation的外观设置和页面之间的跳转