我尝试在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 Entity中ItemID成员的HTMLContent。由于ItemID可能来自HTMLContent以外的其他ID,因此我无法映射直接外键。我该如何使用实体?
最佳答案
我本人对该MVC还是陌生的,但我认为我可以看到您需要做的事情。您可能需要查看创建视图模型。可以尝试构建一个针对您的特定需求的类,而不是尝试访问MVC中尚未实现的嵌套对象。
像这样的东西:
public class ViewHtmContentAndContentItem
{
public ContentItem contentItems {get; set;}
public HTMLContent HtmlContentItems {get; set;}
}
现在,当您执行Linq查询时,可以在两个表中的
PageId
上联接两个表,然后将此对象返回到View。在此表单中,您可以访问所需的任何属性。
希望这可以帮助。
关于c# - 在3个实体之间创建导航属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14025346/