間にマッピングを作成しようとしている 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 行しか表示されません。ContentItem エンティティ内の ItemID メンバーに対応する ID を持つ HTMLContent を返すようにします。ItemID は HTMLContent 以外の別の ID から取得される可能性があるため、直接外部キーをマップすることはできません。エンティティでこれを行うにはどうすればよいですか?