我正在使用.NET Core 3.1構建此應用,而我的json輸出不正確。這是我想要的課程列表:
[DataContract(IsReference = true)]
public class State
{
public int Id { get; set; }
[DataMember]
public string Name { get; set; }
[DataMember]
public List<Region> Regions { get; }
public State()
{
Name = string.Empty;
Regions = new List<Region>();
}
public State(string name)
{
Name = name;
Regions = new List<Region>();
}
}
它具有Regions
列表,該類如下:
[DataContract(IsReference = true)]
public class Region
{
public int Id { get; set; }
[DataMember]
public string Name { get; set; }
[DataMember]
public List<County> Counties { get; }
[DataMember]
public List<Report> Reports { get; }
[DataMember]
public State State { get; set; }
public int StateId { get; set; }
public Region()
{
Name = string.Empty;
State = new State();
Reports = new List<Report>();
Counties = new List<County>();
}
public Region(string name)
{
Name = name;
State = new State();
Reports = new List<Report>();
Counties = new List<County>();
}
}
這是我的方法:
[HttpGet]
public async Task<ActionResult<List<State>>> GetReportsAsync()
{
return await context.States.Include(x => x.Regions).ToListAsync() is IList<State> states
? Ok(states)
: (ActionResult<List<State>>)NoContent();
}
這是我的DbContext
:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
if (modelBuilder is null) throw new ArgumentNullException(nameof(modelBuilder));
modelBuilder.Entity<Report>(report =>
{
report.HasOne(x => x.County).WithMany(x => x.Reports).HasForeignKey(x => x.CountyId);
report.HasOne(x => x.Region).WithMany(x => x.Reports).HasForeignKey(x => x.RegionId);
});
modelBuilder.Entity<State>(state => state.HasIndex(x => x.Name).IsUnique());
modelBuilder.Entity<Region>(region =>
{
region.HasIndex(x => x.Name).IsUnique();
region.HasOne(x => x.State).WithMany(x => x.Regions).HasForeignKey(x => x.StateId);
});
modelBuilder.Entity<County>(county =>
{
county.HasIndex(x => x.Name).IsUnique();
county.HasOne(x => x.Region).WithMany(x => x.Counties).HasForeignKey(x => x.RegionId);
});
}
但是我沒有在json輸出中填充我的Regions
列表。我應該指出,在調用另一種填充數據庫的方法然後調用該方法之後,確實可以得到預期的結果,但是如果我直接調用,則Reports
列表將為空。請幫我在這裡。
該問題是由參考導航屬性初始化程序引起的:
public Workplace Workplace { get; set; } = new Workplace(); // <--
永遠不要那樣做-它會使EF導航屬性修正混亂,並導致意外的運行時行為。
請注意,初始化集合導航屬性是可以的,儘管不是必需的。這是因為參考導航屬性中的null
具有特殊含義,並且確實提供了指向主體實體的鏈接,主體實體可能包含也可能不包含相關實體的集合。
不久,刪除初始化程序
public Workplace Workplace { get; set; }
問題就會解決。
如果您正在使用數據的延遲加載,則需要枚舉數據,以便將其拉入EF上下文。默認情況下不檢索子元素。您可以做的另一件事是在構造查詢時明確包括子代。您可以在此處查看include操作的工作方式: https : //entityframework.net/include-multiple-levels
您還可以在此處看到相關問題:將孩子包括在EF中