gpt4 book ai didi

c# - ASP.NET WebApi JSON 响应和带有外键的实体

转载 作者:太空狗 更新时间:2023-10-29 23:30:19 25 4
gpt4 key购买 nike

我正在从事 WebApi 项目,我的域中有 2 个实体:
街道

public class Street
{
public int ID { get; set; }
public string Name { get; set; }
public int StreetTypeID { get; set; }
public virtual StreetType StreetType { get; set; }
}

和街道类型:

public class StreetType
{
public int ID { get; set; }
public string Name { get; set; }
public virtual ICollection<Street> Streets { get; set; }
}

我使用 FluenApi 来映射这些实体:

public class StreetTypeMap : EntityTypeConfiguration<StreetType>
{
public StreetTypeMap()
{
HasKey(t => t.ID);
Property(t => t.ID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
Property(t => t.Name).IsRequired().HasMaxLength(50);
HasMany(a => a.Streets).WithRequired(p => p.StreetType).HasForeignKey(p => p.StreetTypeID);
ToTable("StreetType");
}
}

和 Street 实体类似。
现在我得到 JSON:

{
"id":1,
"name":"Street1",
"streettypeid":3
}

我怎样才能得到像这样的 JSON:

{
"id":1,
"name":"Street1",
"streettypeid":
{
"id":3,
"name":"Type3"
}
}

或者一些类似的结构。我如何在 .NET 中完成此操作?

我的 Controller :

StreetController : BaseApiController<Street>

    public class BaseApiController<T> : ApiController where T : BaseEntity
{
protected UnitOfWork unitOfWork = new UnitOfWork();

protected IRepository<T> repository;

public BaseApiController()
{
repository = unitOfWork.EFRepository<T>();
}
public virtual IQueryable<T> Get()
{
var entity = repository.Table;

if (entity == null)
{
throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.NoContent));
}
return entity;
}

最佳答案

要在 JSON 中保留对象引用,请将以下代码添加到 Global.asax 文件中的 Application_Start 方法:

var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.SerializerSettings.PreserveReferencesHandling =
Newtonsoft.Json.PreserveReferencesHandling.All;

更多数据请阅读this文章。

另一种方法是尝试使用 OData在你的 webapi 中。您必须安装 OData 包:

Install-Package Microsoft.AspNet.Odata

然后您就可以使用 $expand 将相关实体包含在响应中。
你可以保持原样,但我认为添加 IgnoreDataMember 是正确的(不要忘记添加 using System.Runtime.Serialization;)

public class StreetType
{
public int ID { get; set; }
public string Name { get; set; }
[IgnoreDataMember]
public virtual ICollection<Street> Streets { get; set; }
}

还需要给你Get方法添加属性:

[EnableQuery]
public virtual IQueryable<T> Get()

之后你可以像这样创建http请求:

http://blablabla/Street?$expand=StreetType

并获取所有街道及其StreetType

关于c# - ASP.NET WebApi JSON 响应和带有外键的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31685944/

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