Entity Framework Core, отношение один ко многим, коллекция всегда пуста - PullRequest
0 голосов
/ 30 июня 2019

Я пытаюсь установить простое отношение один ко многим в базе данных InMemory, которая создается во время выполнения по HTTP-запросам. Я новичок в Entity Framework Core, поэтому я не уверен, что это правильный способ работы с ним.

ValuesController.cs

[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
    private readonly DataListContext _Context;
    public ValuesController(DataListContext context)
    {
        _Context = context;
    }

    [HttpGet]
    public ActionResult<IEnumerable<DataList>> Get()
    { 
        // Datas keeps is value
        Console.WriteLine("Root Count: " + _Context.RootDatas.Count());
        if (_Context.RootDataLists.Count() > 0)
        {
            // InsideDatas is always 
            Console.WriteLine("Inside Count: " + _Context.RootDataLists.First().InsideDatas.Count);empty next request
        }

        return _Context.RootDataLists.ToList();
    }

    [HttpPost]
    public void Post([FromBody] string value)
    {
        var data = new Data() { Id = Guid.NewGuid() };
        _Context.RootDatas.Add(data);

        var dataList = new DataList();
        dataList.Name = value;
        dataList.InsideDatas.Add(data);

        _Context.RootDataLists.Add(dataList);
        _Context.SaveChanges();

        // InsideDatas has an element
        Console.WriteLine("Inside Count: " + _Context.RootDataLists.First().InsideDatas.Count);
    }
}

public class DataListContext : DbContext
{
    public DbSet<DataList> RootDataLists { get; set; }
    public DbSet<Data> RootDatas { get; set; }
    public DataListContext(DbContextOptions<DataListContext> options) : base(options) { }
}

public class Data
{
    [Key] public Guid Id { get; set; }
}

public class DataList
{
    public DataList()
    {
        InsideDatas = new List<Data>();
    }

    [Key]
    public string Name { get; set; }
    public ICollection<Data> InsideDatas { get; set; }
}

Startup.cs

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<DataListContext>(options => options.UseInMemoryDatabase(databaseName: "DataList"));
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseMvc();
    }
}

Моя проблема, если список InsideDatas всегда пуст при следующем вызове, но не RootDatas. RobDatas DbSet в DataListContext - это на самом деле не то, что мне нужно в моем приложении, но я решил, что база данных сохранит элемент InsideDatas. Но нет.

Значит, я все неправильно использую? Мой пример использования - это листинг сервера, который создается во время выполнения хостами, публикующими информацию о своем присутствии в сервисе листинга. Мой план состоит в том, чтобы поменять InMemoryDatabase на redis, чтобы иметь возможность правильно масштабировать его при необходимости. (Этот код является просто уменьшенной версией действующего кода с той же проблемой)

1 Ответ

1 голос
/ 30 июня 2019

Вам нужно указать EF Core для загрузки связанных сущностей . Один путь - через нетерпеливая загрузка :

// notice the Include statement
_Context.RootDataLists.Include(x => x.InsideDatas).First().InsideDatas
...