EF Core Data является нулевым - PullRequest
0 голосов
/ 15 апреля 2020

Большинство ответов в этом состоянии гласят, что DbSet в контексте должен быть свойством. Однако в данном случае это не так, поскольку DbSet этого контекста является свойством. Вот пример кода, который я могу использовать для воссоздания проблемы. Пожалуйста, сообщите.

Вот код:

DbContext

using Microsoft.EntityFrameworkCore;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace Dal
{
    public class SampleContext : DbContext
    {
        public DbSet<Model.ItemCode> ItemCodes { get; set; }

        public SampleContext(DbContextOptions<SampleContext> options) : base(options)
        {
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.ApplyConfiguration(new Mapping.ItemCodeConfiguration());
            base.OnModelCreating(modelBuilder);
        }

        public async Task<IEnumerable<Model.ItemCode>> GetCodesByGroup(int group)
        {
            return await ItemCodes.Where(g => g.GroupId == group).ToListAsync();
        }

    }
}

Модель

namespace Dal.Model
{
    public class ItemCode
    {
        public int Id { get; set; }
        public string Code { get; set; }
        public string Description { get; set; }
        public int Quantity { get; set; }
        public int KcId { get; set; }
        public int CategoryId { get; set; }
        public int GroupId { get; set; }
    }
}

Отображение данных

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;

namespace Dal.Mapping
{
    public class ItemCodeConfiguration : IEntityTypeConfiguration<Model.ItemCode>
    {
        public void Configure(EntityTypeBuilder<Model.ItemCode> builder)
        {
            builder.HasKey(b => b.Id);
            builder.Property(b => b.Description)
                .HasColumnName("Description")
                .HasColumnType("nvarchar(255)")
                .IsRequired();
            builder.Property(b => b.Code)
                .HasColumnName("Code")
                .IsRequired();
            builder.Property(b => b.KcId)
                .HasColumnName("KcId");
            builder.Property(b => b.Quantity)
                .HasColumnName("Quantity");
            builder.Property(b => b.GroupId)
                .HasColumnName("GroupId")
                .IsRequired();
            builder.Property(b => b.CategoryId)
                .HasColumnName("CategoryId")
                .IsRequired();
            builder.ToTable("ItemCode", "lookup");
        }
    }
}

Тестовый класс

using Microsoft.EntityFrameworkCore;
using Xunit;

namespace Dal.Test
{
    public class DataTest
    {
        readonly SampleContext context;
        public DataTest()
        {
            var testContextOptions = new DbContextOptionsBuilder<SampleContext>();
            testContextOptions.UseSqlServer(@"Server=localServerName;Database=SampleAppDb;User Id=SampleUser;Password=sampleUser!Password");
            testContextOptions.UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking);
            context = new SampleContext(testContextOptions.Options);
        }


        [Fact]
        public async void Test1()
        {
            var codes = await context.GetCodesByGroup(1);
            Assert.NotNull(codes);
            Assert.NotEmpty(codes);
        }
    }
}

1 Ответ

0 голосов
/ 16 апреля 2020

Нашел ответ, была глупая ошибка. Ошибка заключалась в том, что есть столбцы типа int, которые можно обнулять, но свойства не обнуляются. Исправленный класс:

namespace Dal.Model
{
    public class ItemCode
    {
        public int Id { get; set; }
        public string Code { get; set; }
        public string Description { get; set; }
        public int? Quantity { get; set; }
        public int? KcId { get; set; }
        public int CategoryId { get; set; }
        public int GroupId { get; set; }
    }
}
...