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

4

1 に答える 1

0

私自身、この MVC は初めてですが、何をする必要があるかはわかると思います。View-Model の作成を検討することをお勧めします。まだ理解していない MVC のネストされたオブジェクトにアクセスしようとするのではなく、特定のニーズに合わせて調整されたクラスを構築できます。

このようなもの :-

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

これで、Linq クエリを実行すると、両方のテーブルで両方のテーブルを結合し、PageIdこのオブジェクトをビューに返すことができます。

そこから、必要なプロパティにアクセスできます。

お役に立てれば。

于 2012-12-24T21:02:00.423 に答える