EF核心很多很多。返回实体时出错

时间:2018-03-22 15:25:28

标签: c# entity-framework asp.net-core entity-framework-core asp.net-core-webapi

我正在使用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-class中:

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);

}

所有内容都按预期构建,但是在尝试调用控制器操作时,即获取团队(我希望包括所有成员)或成员(我希望包括所有成员团队 - 上面未包含的代码)。 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

我错过了一些明显的东西吗?

2 个答案:

答案 0 :(得分:1)

您的数据结构中有一个参考循环(团队 - &gt;团队成员 - &gt;团队),而JSON编码器无法处理此问题。

我可以想出两种方法来解决这个问题:

  • 配置JSON编码器以忽略参考循环

Startup.cs中,添加以下内容:

services
    .AddMvc()
    .AddJsonOptions(options => {
        options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
    });

来自documentation

  

ReferenceLoopHandling.Ignore :Json.NET将忽略引用循环中的对象而不是序列化它们。第一次遇到一个对象时,它将像往常一样被序列化,但如果该对象作为自身的子对象遇到,则序列化器将跳过序列化它。

  • [JsonIgnore]属性添加到您要忽略的媒体资源

例如:

public class TeamMember
{
    public int TeamId { get; set; }
    [JsonIgnore]
    public Team Team { get; set; }
}

答案 1 :(得分:0)

可能与某些循环引用问题有关?!

你的teamMember属性有一个Team属性,它还有一个teamMember属性等等......当尝试序列化时,会创建一个永无止境的循环。

也许您可以将teamMember.Team属性设置为null。我想你还必须将teamMember.Member.teamMember属性设置为null。