我正在使用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
我错过了一些明显的东西吗?
答案 0 :(得分:1)
您的数据结构中有一个参考循环(团队 - &gt;团队成员 - &gt;团队),而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; }
}
答案 1 :(得分:0)
可能与某些循环引用问题有关?!
你的teamMember属性有一个Team属性,它还有一个teamMember属性等等......当尝试序列化时,会创建一个永无止境的循环。
也许您可以将teamMember.Team属性设置为null。我想你还必须将teamMember.Member.teamMember属性设置为null。