EF代码首先流畅:多对多的附加字段在可接合

本文关键字:字段 接合 EF 代码 | 更新日期: 2023-09-27 18:05:02

我正在建立一个wiki,它的文章由子文章组成。一个条目可以由多个子条目组成,一个子条目可以附在多个条目上。在jointable中,有一个排序顺序,用于定义特定项目的子项目的显示。父条目只包含一个标题(和元数据),没有文本,所有文本都是通过子条目完成的。

这个排序在jointable虽然,是我卡住的地方,我不能从我的查询访问它。希望有人能给我指出正确的方向。

旁注:在整个MVC/EF世界中,我是一个新手,甚至c#/vb和。net也是我几个月来在业余时间才开始研究的。

我有这些类:

文章:

public class Article : BaseEntity
{
    private ICollection<Category> _categories;
    private ICollection<ArticleSubarticle> _subarticles;
    public string Title { get; set; }
    public int AuthorId { get; set; }
    public DateTime CreationDate { get; set; }
    public DateTime ?PublishDate { get; set; }
    public DateTime ?ChangeDate { get; set; }
    public bool Published { get; set; }
    public virtual ICollection<Category> Categories
    {
        get { return _categories ?? (_categories = new List<Category>()); }
        protected set { _categories = value; }
    }
    public virtual ICollection<ArticleSubarticle> Subarticles
    {
        get { return _subarticles ?? (_subarticles = new List<ArticleSubarticle>()); }
        protected set { _subarticles = value; }
    }
}

Subarticle

public class Subarticle : Article
    {
        private ICollection<Attachment> _attachments;
        public string ArticleText { get; set; }
        public int OriginalArticle { get; set; }
        public bool Active { get; set; }
        public virtual ICollection<Attachment> Attachments
        {
            get { return _attachments ?? (_attachments = new List<Attachment>()); }
            protected set { _attachments = value; }
        }
    }

Jointable:

public class ArticleSubarticle : BaseEntity
    {
        public int ParentId { get; set; }
        public int ChildId { get; set; }
        public int SortOrder { get; set; }
        public virtual Article Parent { get; set; }
        public virtual Subarticle Child { get; set; }
    }

它们的映射如下:

文章

public ArticleMap () {
            ToTable("Wiki_Article");
            HasKey(a => a.Id);
            Property(a => a.Title).HasColumnType("VARCHAR").HasMaxLength(250);
            Property(a => a.AuthorId);
            Property(a => a.PublishDate).IsOptional();
            Property(a => a.ChangeDate).IsOptional();
            HasMany(a => a.Categories)
                .WithMany()
                .Map(a => a.ToTable("Wiki_Article_Category_Mapping"));

        }

Subarticle

public SubarticleMap()
        {
            ToTable("Wiki_Subarticle");
            HasKey(sa => sa.Id);
            Property(a => a.ArticleText)
                .IsOptional()
                .HasColumnType("TEXT");
            Property(a => a.OriginalArticle)
                .IsOptional();
            HasMany(a => a.Attachments)
                .WithMany()
                .Map(a => a.ToTable("Wiki_Subarticle_Attachment_Mapping"));
        }

Jointable

public ArticleSubarticleMap()
        {
            ToTable("Wiki_Article_Subarticle_Mapping");
            HasKey(asa => new { asa.ParentId, asa.ChildId });
            HasRequired(asa => asa.Parent)
                .WithMany(asa => asa.Subarticles)
                .HasForeignKey(asa => asa.ParentId);
        }

这使我得到了预期的数据库。

现在我想要一个包含子条目的文章,它们按照排序顺序排序。这个查询得到了文章及其子条目,但我似乎不知道如何在Wiki_Article_Subarticle_Mapping表中达到这个排序顺序。

public IList<Article> getArticleByIdWithSortedSubarticles(int ArticleId)
        {
            var query = _articleRepository.Table;
            query = query.Where(a => ArticleId == a.Id)
                         .Select(a => a);
            var subarticles = query.ToList();
            return subarticles;
        }

任何想法?

提前感谢!

EF代码首先流畅:多对多的附加字段在可接合

您的查询目前没有加载子条目,所以我猜它们是惰性加载的。尝试像这样显式加载它们:

public IList<Article> getArticleByIdWithSortedSubarticles(int ArticleId)
{
    var query = _articleRepository.Table;
    query = query.Where(a => ArticleId == a.Id)
                 .Select(a => new { article = a, subs = a.SubArticles.OrderBy(s => s.SortOrder) });
    return query.AsEnumerable().Select(m => m.article).ToList();
}