簡體   English   中英

EF核心多對多。 返回實體時出錯

[英]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編碼器無法處理此循環。

我可以想到兩種解決方法:

  • 配置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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM