在 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 => 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 个实体之间创建导航属性的主要内容,如果未能解决你的问题,请参考以下文章