gpt4 book ai didi

wcf - 通过WCF的 Entity Framework 导航属性循环问题

转载 作者:行者123 更新时间:2023-12-04 18:12:03 29 4
gpt4 key购买 nike

我有一个像

public class User
{
[Key]
public long UserId { get; set; }

[Required]
public String Nickname { get; set; }

public virtual ICollection<Group> Memberships { get; set; }
}

public class Group
{
[Key]
public long GroupId { get; set; }

[Required]
public String Name { get; set; }

public virtual ICollection<User> Members { get; set; }
}

public class DataContext : DbContext
{
public DbSet<User> Users { get; set; }
public DbSet<Group> Groups { get; set; }

public DataContext()
{
Configuration.LazyLoadingEnabled = true;
}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<User>()
.HasMany(u => u.Memberships)
.WithMany(t => t.Members)
.Map(x =>
{
x.MapLeftKey("UserId");
x.MapRightKey("GroupId");
x.ToTable("GroupMembers");
});
}
}

使用测试控制台应用程序访问实体时,一切都很好,但是我需要通过WCF服务来实现这一点,在这里,我遇到了以下异常:

Failed to invoke the service. Possible causes: The service is offline or inaccessible; the client-side configuration does not match the proxy; the existing proxy is invalid. Refer to the stack trace for more detail. You can try to recover by starting a new proxy, restoring to default configuration, or refreshing the service



我发现可以进行此操作的唯一方法是删除其中一个实体中的导航器,因为两边都有导航器会导致无限循环。

有没有一种方法可以在不删除导航器的情况下进行此工作?

最佳答案

如果您尝试使用WCF,则会有两个问题:

  • 第一个问题:您是否还想返回相关实体?使用WCF/序列化时,请始终关闭延迟加载,并确保对真正要返回的关系手动使用Include。否则,延迟加载将加载对象图中的所有关系。此外,根据服务处理上下文生命周期的方式,当上下文已经处置时,可能会发生延迟加载。
  • 您必须告知序列化程序有关循环引用的内容或删除循环引用。 WCF默认使用DataContractSerializer。要删除循环引用,您可以使用IgnoreDataMember属性标记这些导航属性之一,或者您可以通过标记所有带有DataContract(IsReference = true)属性的实体和应该使用DataMember属性序列化的所有成员属性来简单地告诉序列化程序有关循环引用的信息。
  • 关于wcf - 通过WCF的 Entity Framework 导航属性循环问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11715120/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com