【问题标题】:EF code first FLUENT: many to many with additional field in jointableEF 代码优先 FLUENT:多对多,在可连接中具有附加字段
【发布时间】:2015-10-17 01:16:35
【问题描述】:

我正在构建一个 wiki,其中包含由子条目组成的文章。一篇文章可以由多个子文章组成,一个子文章可以附加到多个文章。在可连接中,有一个排序顺序,它定义了特定文章的子文章的显示。 父文章只包含标题(和元数据),没有文字,所有文字都是通过子文章完成的。

不过,joinable 中的这个排序顺序是我卡在 atm 的地方,我无法从我的查询中访问它。希望有人能指出我正确的方向。

旁注:我是整个 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; }
    }

}

子条目

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; }
        }

    }

可联合:

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"));



        }

子条目

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"));

        }

可连接

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;

        }

有什么想法吗?

提前致谢!

【问题讨论】:

    标签: c# entity-framework many-to-many code-first fluent


    【解决方案1】:

    您的查询当前没有加载子文章,所以我猜它们是延迟加载的。尝试像这样显式加载它们:

    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();
    }
    

    【讨论】:

    • 子文章正在加载(我假设通过定义的关系?)无论如何我确实得到了我的子文章列表......
    • 是的,因为您创建了 Subarticles 集合 virtual,它启用了延迟加载。但这不能保证任何订购。
    • 好吧,我已经尝试过你的建议,现在奇怪的是,我在 a.SubArticles 上收到错误('Article 不包含 SubArticles 的定义并且没有 SubArticles 接受的扩展方法可以找到 Article 类型的第一个参数(您是否缺少 using 指令或程序集引用)。但是当我输入您的建议(而不是复制粘贴)时,VS 自动完成确实给了我 a.SubArticles 并且当我将鼠标悬停在,他肯定认出它是参数文章。这里有什么建议吗?
    • 我对您的存储库了解得不够多,尤其是。 _articleRepository.Table 部分。也许您应该考虑将您的 DbContext 作为参数传递给您的查询,然后执行类似 context.Articles.Where(... 的操作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-16
    • 1970-01-01
    相关资源
    最近更新 更多