[英]EF Core Many To Many. Error returning entities
我正在使用dotnet core(2)和EF Core實現WebAPI。 該應用程序使用UnitOfWork / Repository-pattern。 我已經到達需要實現“多對多”關系的地步,但遇到了一些麻煩。 這是我的沙發床:
實體:
public class Team : DataEntity
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int TeamId { get; set; }
public int OrganizationID { get; set; }
public string Name { get; set; }
public string URL { get; set; }
public virtual ICollection<Season> Seasons { get; set; }
public ICollection<TeamMember> TeamMember { get; set; }
}
public class Member : DataEntity
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int MemberId { get; set; }
public string Name { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string MobilePhone { get; set; }
public string Email { get; set; }
public int RelatedTo { get; set; }
public int TeamRole { get; set; }
public ICollection<TeamMember> TeamMember { get; set; }
}
public class TeamMember
{
public int TeamId { get; set; }
public Team Team { get; set; }
public int MemberId { get; set; }
public Member Member { get; set; }
}
在我的DbContext類中:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<TeamMember>()
.HasKey(t => new { t.TeamId, t.MemberId });
modelBuilder.Entity<TeamMember>()
.HasOne(tm => tm.Team)
.WithMany(t => t.TeamMember)
.HasForeignKey(tm => tm.TeamId);
modelBuilder.Entity<TeamMember>()
.HasOne(tm => tm.Member)
.WithMany(t => t.TeamMember)
.HasForeignKey(tm => tm.MemberId);
}
在我的存儲庫中,我具有IncludeAll的擴展名:
public static IQueryable<Team> IncludeAll(this IGenericRepository<Team> repository)
{
return repository
.AsQueryable()
.Include(s => s.Seasons)
.Include(tm => tm.TeamMember);
}
一切都按預期構建,但是當嘗試調用獲取一個Team(我希望包括所有成員)或Member(我希望包括所有成員團隊-上面未包括的代碼)的控制器操作時。 SwaggerUI返回:TypeError:無法獲取。 如果我嘗試直接在chrome( http:// localhost / api / Team / 1 )中調用控制器動作,則會得到不完整的結果,但結果卻不盡相同...):
{
"value":
{
"teamId":1,
"organizationID":1,
"name":"Team1",
"url":"http://www.team1.com",
"seasons":[
{
"id":1,
"teamID":1,
"name":"PK4",
"description":null,
"startDate":"2017-09-01T00:00:00",
"endDate":"2018-12-31T00:00:00",
"created":"2017-12-01T00:00:00",
"updated":"2017-12-27T00:00:00",
"createdBy":"magnus",
"updatedBy":"magnus"
}],
"teamMember":[
{
"teamId":1
我是否缺少明顯的東西?
您的數據結構中有一個引用循環(團隊->團隊成員->團隊),並且JSON編碼器無法處理此循環。
我可以想到兩種解決方法:
在Startup.cs
,添加以下內容:
services
.AddMvc()
.AddJsonOptions(options => {
options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
});
從文檔中 :
ReferenceLoopHandling.Ignore :Json.NET將忽略引用循環中的對象,而不對它們進行序列化。 第一次遇到對象時,它將照常進行序列化,但是如果將該對象作為自身的子對象遇到,則序列化程序將跳過對其進行序列化。
[JsonIgnore]
屬性添加到要忽略的屬性 例如:
public class TeamMember
{
public int TeamId { get; set; }
[JsonIgnore]
public Team Team { get; set; }
}
可能與一些循環參考問題有關!
您的teamMember屬性具有Team屬性,而該屬性又具有teamMember屬性,依此類推...嘗試序列化時,將創建一個永無止境的循環。
也許您可以將teamMember.Team屬性設置為null。 我認為您還必須將teamMember.Member.teamMember屬性設置為null。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.