属性 个反序列化 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
我的控制器中有一个简单的 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