首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在EFCore中使用DBContext查询时,什么会导致"Collection is read-only“异常?

在EFCore中使用DBContext查询时,什么会导致"Collection is read-only“异常?
EN

Stack Overflow用户
提问于 2020-06-28 00:07:32
回答 1查看 326关注 0票数 0

当我用我的DBContext执行一个基本的查询时,我得到了以下异常,并且我不能弄清楚它。它是一个控制台应用程序。

抛出的异常是:

代码语言:javascript
复制
        fail: Microsoft.EntityFrameworkCore.Query[10100]
          An exception occurred while iterating over the results of a query for context type 'JobAssist.Services.ArticleBankMgmt.Infrastructure.ArticleBankContext'.
          System.NotSupportedException: Collection is read-only.
             at System.Collections.ObjectModel.ReadOnlyCollection`1.System.Collections.Generic.ICollection<T>.Add(T value)
             at Microsoft.EntityFrameworkCore.Metadata.Internal.ClrICollectionAccessor`3.Add(Object entity, Object value, Boolean forMaterialization)
             at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.InternalEntityEntry.AddToCollection(INavigation navigation, InternalEntityEntry value, Boolean forMaterialization)
             at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.InternalMixedEntityEntry.AddToCollection(INavigation navigation, InternalEntityEntry value, Boolean forMaterialization)
             at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.NavigationFixer.AddToCollection(InternalEntityEntry entry, INavigation navigation, InternalEntityEntry value, Boolean fromQuery)
             at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.NavigationFixer.SetReferenceOrAddToCollection(InternalEntityEntry entry, INavigation navigation, InternalEntityEntry value, Boolean fromQuery)
             at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.NavigationFixer.ToDependentFixup(InternalEntityEntry dependentEntry, InternalEntityEntry principalEntry, IForeignKey foreignKey, Boolean fromQuery)
             at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.NavigationFixer.InitialFixup(InternalEntityEntry entry, Boolean fromQuery)
             at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.NavigationFixer.TrackedFromQuery(InternalEntityEntry entry)
             at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.InternalEntityEntryNotifier.TrackedFromQuery(InternalEntityEntry entry)
             at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.InternalEntityEntry.MarkUnchangedFromQuery()
             at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.StartTrackingFromQuery(IEntityType baseEntityType, Object entity, ValueBuffer& valueBuffer)
             at Microsoft.EntityFrameworkCore.Query.QueryContext.StartTracking(IEntityType entityType, Object entity, ValueBuffer valueBuffer)
             at lambda_method(Closure , QueryContext , DbDataReader , ResultContext , ResultCoordinator )
             at Microsoft.EntityFrameworkCore.Query.RelationalShapedQueryCompilingExpressionVisitor.CustomShaperCompilingExpressionVisitor.<PopulateIncludeCollection>g__ProcessCurrentElementRow|9_0[TIncludingEntity,TIncludedEntity](<>c__DisplayClass9_0`2& )
             at Microsoft.EntityFrameworkCore.Query.RelationalShapedQueryCompilingExpressionVisitor.CustomShaperCompilingExpressionVisitor.PopulateIncludeCollection[TIncludingEntity,TIncludedEntity](Int32 collectionId, QueryContext queryContext, DbDataReader dbDataReader, ResultCoordinator resultCoordinator, Func`3 parentIdentifier, Func`3 outerIdentifier, Func`3 selfIdentifier, Func`5 innerShaper, INavigation inverseNavigation, Action`2 fixup, Boolean trackingQuery)
             at lambda_method(Closure , QueryContext , DbDataReader , ResultContext , Int32[] , ResultCoordinator )
             at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable`1.Enumerator.MoveNext()
System.NotSupportedException: Collection is read-only.
   at System.Collections.ObjectModel.ReadOnlyCollection`1.System.Collections.Generic.ICollection<T>.Add(T value)
   at Microsoft.EntityFrameworkCore.Metadata.Internal.ClrICollectionAccessor`3.Add(Object entity, Object value, Boolean forMaterialization)
   at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.InternalEntityEntry.AddToCollection(INavigation navigation, InternalEntityEntry value, Boolean forMaterialization)
   at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.InternalMixedEntityEntry.AddToCollection(INavigation navigation, InternalEntityEntry value, Boolean forMaterialization)
   at Microsoft.EntityFramew

代码是:

代码语言:javascript
复制
    var bank = articleBankContext.ArticleBanks.FirstOrDefault();
    Console.WriteLine(bank.Id);

在我的DBContext中,OnModelCreating代码是:

代码语言:javascript
复制
        protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        if (modelBuilder == null)
        {
            throw new ArgumentNullException(nameof(modelBuilder));
        }

        // Build the model
        modelBuilder.ApplyConfiguration(new ClientRequestEntityTypeConfiguration());

        modelBuilder.Entity<ArticleBank>(ab =>
        {
            ab.OwnsMany(ab => ab.ArticleTags, at =>
            {
                at.WithOwner();
                at.Property<DateTime>("CreatedDate");
                at.Property<DateTime>("UpdatedDate");
                at.ToTable("ArticleBankTags");
            });
        });

        modelBuilder.Entity<ArticleBank>(ab =>
        {
            ab.OwnsMany(ab => ab.Sources, s =>
            {
                s.WithOwner();
                s.Property<DateTime>("CreatedDate");
                s.Property<DateTime>("UpdatedDate");
                s.ToTable("ArticleBankSources");
            });
        });

        modelBuilder.Entity<Article>().OwnsOne(a => a.JSeeker).OwnsOne(a => a.Name);

        modelBuilder.Entity<Article>().OwnsMany(a => a.Ratings, ar => ar.ToTable("ArticleRatings").OwnsOne(ar => ar.JSeeker).OwnsOne(js => js.Name));
        modelBuilder.Entity<Article>().OwnsOne(a => a.Source).WithOwner();
        modelBuilder.Entity<Article>().OwnsMany(a => a.Tags).WithOwner();

        modelBuilder.Entity<ArticleBank>().HasMany(s => s.Articles);

        ////Create Shadow Properties
        modelBuilder.Entity<ArticleBank>().Property<DateTime>("CreatedDate");
        modelBuilder.Entity<ArticleBank>().Property<DateTime>("UpdatedDate");
        modelBuilder.Entity<Article>().Property<DateTime>("CreatedDate");
        modelBuilder.Entity<Article>().Property<DateTime>("UpdatedDate");
        modelBuilder.Entity<Article>().ToTable("ArticleBankArticles");
    }

我怎么知道他们说的是什么“只读集合”?在解决方案中的其他项目中,我没有遇到过类似的问题。我有一个"PrePopulateDB()“,它实际上使用相同的上下文并将适当的数据添加到数据库中。

以下是ArticleBanK中的声明:

我在构造函数中创建列表。

代码语言:javascript
复制
private readonly List<ArticleTag> _articleTags; 
public IEnumerable<ArticleTag> ArticleTags => _articleTags.AsReadOnly(); /
private readonly List<Article> _articles; 
public IEnumerable<Article> Articles => _articles.AsReadOnly();

此外,奇怪的是,在DBContext.Model.DebugView中没有Sources属性的字段:

代码语言:javascript
复制
  EntityType: ArticleBank
    Navigations:
      Articles (_articles, IEnumerable<Article>) Collection ToDependent Article
      ArticleTags (_articleTags, IEnumerable<ArticleTag>) Collection ToDependent ArticleBank.ArticleTags#ArticleTag
        Annotations:
          EagerLoaded: True
      Sources (no field, IEnumerable<ArticleSource>) Collection ToDependent ArticleBank.Sources#ArticleSource
        Annotations:
          EagerLoaded: True
EN

回答 1

Stack Overflow用户

发布于 2020-06-28 06:40:46

我发现了问题所在。

我没有按惯例行事。我的导航字段(源)和(_articleSources)的属性不对齐。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62612389

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档