集合是只读 EfCore Include 方法的异常

问题描述 投票:0回答:1
I am encoutering error

System.NotSupportedException:集合是只读的

使用 EfCoresql server 选择 Film 聚合时,如下所示:

var film = await dbContext.Films
     .Include(f => f.CountryItems)
     .FirstOrDefaultAsync(f => f.Id == FilmId.Of(query.id), cancellationToken)

我的电影集合看起来像这样:

public class Film : Aggregate<FilmId>
    {
    private readonly List<CountryItem> _filmCountries = [];
    public IReadOnlyList<CountryItem> CountryItems => _filmCountries.AsReadOnly();
    ...
    }

CountryItem 实体看起来像这样:

public class CountryItem : Entity<FilmCountryId>
{
    protected CountryItem() { }

    internal CountryItem(CountryName name, FilmId filmId)
    {
        Name = name;
        FilmId = filmId;
    }

    public CountryName Name { get; private set; } = default!;
    public FilmId FilmId { get; private set; } = default!;
}

用于迁移的胶片配置:

public class FilmsConfiguration : IEntityTypeConfiguration<Film>
{
    public void Configure(EntityTypeBuilder<Film> builder)
    {
        builder.HasKey(f => f.Id);
        builder.Property(f => f.Id)
               .HasConversion(filmid => filmid.Value, f => FilmId.Of(f))
                .ValueGeneratedOnAdd()
                .UseIdentityColumn();

        builder.HasMany(f => f.CountryItems)
                .WithOne()
                .HasForeignKey(c => c.FilmId);
    }
}

CountryItem配置:

public class CountryItemsConfiguration : IEntityTypeConfiguration<CountryItem>
{
    public void Configure(EntityTypeBuilder<CountryItem> builder)
    {
        builder.HasKey(c => c.Id);
        builder.Property(c => c.Id)
            .HasConversion(c => c.Value, id => FilmCountryId.Of(id))
            .ValueGeneratedOnAdd()
            .UseIdentityColumn();

        builder.Property(c => c.Name).HasMaxLength(50).IsRequired()
            .HasConversion(c => c.Value, name => CountryName.Of(name));

        builder.Property(c => c.FilmId)
            .HasConversion(c => c.Value, c => FilmId.Of(c))
            .IsRequired();
    }
}

谁能告诉我在这种情况下会出现什么问题吗?因为它在其他项目中适用于这种情况:

 var orders = await dbContext.Orders
                .Include(o => o.OrderItems)
                .FirstOrDefaultAsync(o=>o.Id == OrderId.Of(new Guid("7e761dbd-1aaa-4640-8db6-d12a883e4080")),cancellationToken);

public class Order : Aggregate<OrderId>
{
    private readonly List<OrderItem> _orderItems = new();
    public IReadOnlyCollection<OrderItem> OrderItems => _orderItems.AsReadOnly();
...
}
public class OrderItem : Entity<OrderItemId>
{
    protected OrderItem() { }

    internal OrderItem(OrderId orderId, ProductId productId, int quantity, decimal price)
    {
        Id = OrderItemId.Of(Guid.NewGuid());
        OrderId = orderId;
        ProductId = productId;
        Quantity = quantity;
        Price = price;
    }
    public OrderId OrderId { get; private set; } = default!;
    public ProductId ProductId { get; private set; } = default!;
    public int Quantity { get; private set; } = default!;
    public decimal Price { get; private set; } = default!;
}
public class OrderConfiguration : IEntityTypeConfiguration<Order>
{
    public void Configure(EntityTypeBuilder<Order> builder)
    {
        builder.HasKey(o => o.Id);

        builder.Property(o => o.Id).HasConversion(
                        orderId => orderId.Value,
                        dbId => OrderId.Of(dbId));

        builder.HasMany(o => o.OrderItems)
            .WithOne()
            .HasForeignKey(oi => oi.OrderId);
    }
}
public class OrderItemConfiguration : IEntityTypeConfiguration<OrderItem>
{
    public void Configure(EntityTypeBuilder<OrderItem> builder)
    {
        builder.HasKey(oi => oi.Id);

        builder.Property(oi => oi.Id).HasConversion(
                                   orderItemId => orderItemId.Value,
                                   dbId => OrderItemId.Of(dbId));

        builder.HasOne<Product>()
            .WithMany()
            .HasForeignKey(oi => oi.ProductId);

        builder.Property(oi => oi.Quantity).IsRequired();

        builder.Property(oi => oi.Price).IsRequired();
    }
}
c# asp.net linq entity-framework-core
1个回答
0
投票

基于 EF Core 如何查找支持字段的文档。您应该将字段

_filmCountries
重命名为
_countryItems

它将自动解析如何存储只读属性的值。

© www.soinside.com 2019 - 2024. All rights reserved.