属性 个反序列化 JSON 个对象仅在存储库 class 中始终为 null

Property of deserialized JSON objects are always null only in repository class

我的控制器中有一个简单的 GET 函数,用于 return 我存储库中的一小部分对象。每个对象的其中一个属性仅在存储库 class 中始终为空,但在最初填充时不是 dbcontext 本身。我只是为此使用 InMemoryDatabase

这是我的 Home.cs 模型 class:

public class Home
{
    public int Id { get; set; }

    [Required(ErrorMessage = "Address is required")]
    public Address Address { get; set; } // this is what is null

    [Required(ErrorMessage = "Number of rooms is required")]
    public int NumRooms { get; set; }

    [Range(1, 5, ErrorMessage = "Must give a rating between 1 and 5")]
    public int Rating { get; set; }
}

这是 Address.cs 模型:

public class Address
{
    public int Id { get; set; }

    [Required(ErrorMessage = "City is required")]
    public string City { get; set; }

    [Required(ErrorMessage = "State is required")]
    public string State { get; set; }

    [Required(ErrorMessage = "ZipCode is required")]
    [StringLength(5, MinimumLength = 5)]
    public string ZipCode { get; set; }
}

这是我在 Program.cs 中的 Main 函数,我在其中调用以生成一些数据:

public class Program
{
    public static void Main(string[] args)
    {
        var host = CreateHostBuilder(args).Build();
        using (var scope = host.Services.CreateScope())
        {
            var services = scope.ServiceProvider;
            var context = services.GetRequiredService<RepositoryContext>();

            DataGenerator.SeedData(context);
        }
        host.Run();
    }

    // rest of Program.cs
}

这是 DataGenerator class:

public class DataGenerator
{
    public static void SeedData(RepositoryContext context)
    {
        if (!context.Homes.Any())
        {
            var homeData = System.IO.File.ReadAllText("Data/Homes.json");
            var homes = JsonConvert.DeserializeObject<List<Home>>(homeData);
            context.AddRange(homes);
            context.SaveChanges();
        } // I verify here that the home objects in context DO have valid Addresses
    }
}

这里是 Homes.json:

[
  {
    "Address": {
      "City": "CityOne",
      "State": "MA",
      "ZipCode": "44444"
    },
    "NumRooms": "4",
    "Rating": "4"
  },
  {
    "Address": {
      "City": "CityTwo",
      "State": "MA",
      "ZipCode": "3333"
    },
    "NumRooms": "3",
    "Rating": "3"
  },
  {
    "Address": {
      "City": "AnotherCity",
      "State": "MA",
      "ZipCode": "22222"
    },
    "NumRooms": "2",
    "Rating": "2"
  },
  {
    "Address": {
      "City": "SomeCity",
      "State": "MA",
      "ZipCode": "11111"
    },
    "NumRooms": "1",
    "Rating": "1"
  }
]

这是 Dbcontext class:

public class RepositoryContext : DbContext
{
    public DbSet<Home> Homes{ get; set; }

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

这是 Startup.cs ConfigureServices 函数中的相关位:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<RepositoryContext>(x => x.UseInMemoryDatabase("Homes"));
    services.AddScoped<IHomeRepository, HomeRepository>();
    // rest of function
}

HomeRepository class:

public class HomeRepository : IHomeRepository
{
    private readonly RepositoryContext _context;

    public HomeRepository(RepositoryContext context)
    {
        _context = context; // context shows addresses as null here
    }

    public async Task<IEnumerable<Home>> GetHomes()
    {
        var homes = await _context.Homes.ToListAsync(); // address is null here for all home objects
        return homes;
    }
}

最后,这是相关的控制器class:

[ApiController]
[Route("api/[controller]")]
public class HomeController : ControllerBase
{
    private readonly IHomeRepository _repository;

    public HomeController(IHomeRepository repository)
    {
        _repository = repository;
    }

    [HttpGet]
    public async Task<IActionResult> GetHomes()
    {
        var homes = await _repository.GetHomes(); // address is null here for all objects
        return Ok(homes);
    }
}

忘记包含 Address 实体。这就是address没有出现的原因。
.Include(h=>h.Address)添加到Homes

    public async Task<IEnumerable<Home>> GetHomes()
    {
        //var homes = await _context.Homes.ToListAsync(); // address is null here for all home objects
        
        var homes = await _context.Homes.Include(h=>h.Address).ToListAsync(); // include address table

        return homes;
    }

Screenshot

有效。

顺便说一句,这是我见过最详细的问题。 :D