Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在webApi中加载链接/子数据的正确方法_C#_Asp.net_.net_Asp.net Web Api - Fatal编程技术网

C# 在webApi中加载链接/子数据的正确方法

C# 在webApi中加载链接/子数据的正确方法,c#,asp.net,.net,asp.net-web-api,C#,Asp.net,.net,Asp.net Web Api,对于如何在RESTful web api中为具有1对1、1对多关系的实体正确加载数据,我感到有点困惑,我想知道人们是否可以给出建议,哪种方式是正确的,以及为什么不应该以某些方式进行加载。我认为这让我更加困惑,因为我也在尝试创建一个web应用程序来显示数据,我不想围绕web应用程序构建web api,我相信很多人都会犯这样的错误 我们的代码有许多1对1关系,也有1对多关系 例如,公司和联系人 现在,如果我通过webApi加载联系人,当前它将显示类似于此的模型 public class Contac

对于如何在RESTful web api中为具有1对1、1对多关系的实体正确加载数据,我感到有点困惑,我想知道人们是否可以给出建议,哪种方式是正确的,以及为什么不应该以某些方式进行加载。我认为这让我更加困惑,因为我也在尝试创建一个web应用程序来显示数据,我不想围绕web应用程序构建web api,我相信很多人都会犯这样的错误

我们的代码有许多1对1关系,也有1对多关系

例如,公司和联系人

现在,如果我通过webApi加载联系人,当前它将显示类似于此的模型

public class ContactModel() {
    public long Id { get; set; }

    public string Name { get; set; }

    public long CompanyId { get; set; }
}
这对我来说似乎是正确的,如果我想要公司的详细信息,我只需要从公司api加载数据

但是,在使用webApi的web应用程序上,我想在页面上显示此记录,我觉得在web应用程序中进行两次单独调用以加载所有数据是不对的?也许这是因为我习惯了ASP.NET并一次加载所有数据

那么我想要一个这样的模型吗

public class ContactModel() {
    public long Id { get; set; }

    public string Name { get; set; }

    public CompanyModel Company { get; set; }
}

public class CompanyModel() {
    public long Id { get; set; }

    public string Name { get; set; }
}
现在这很有意义,因为现在我有了公司作为一个模型,我可以向用户显示联系人所属的公司名称,再加上我有公司id,所以如果我想将他们传递到公司屏幕(使用公司id作为参数),我可以使用它。另外,现在我可以在我的web应用程序中使用一个web api调用,而不是两个

但是。。。。当我在一个页面上显示多个联系人时会怎么样?是的,我可以使用上面的,但是如果所有联系人都是同一家公司的,那么为每个联系人加载相同的CompanyModel似乎是没有意义的。也许这样更好

public class GetModel() {
    public ICollection<ContactModel> Contacts { get; set; }

    public ICollection<CompanyModel> Companies { get; set; }
}

public class ContactModel() {
    public long Id { get; set; }

    public string Name { get; set; }

    public long CompanyId { get; set; }
}

public class CompanyModel() {
    public long Id { get; set; }

    public string Name { get; set; }
}
public类GetModel(){
公共ICollection联系人{get;set;}
公共ICollection公司{get;set;}
}
公共类ContactModel(){
公共长Id{get;set;}
公共字符串名称{get;set;}
公共长公司ID{get;set;}
}
公共类CompanyModel(){
公共长Id{get;set;}
公共字符串名称{get;set;}
}
现在我可以将所有联系人加载到contacts集合中,并将任何相关公司加载到Companys集合中。但这是否完全违背了通过RESTfulWebAPI加载数据的规则


任何关于webApi关系设计的建议都将不胜感激。

我正在考虑是否应该将此作为评论或答案发布。辩论主要是因为设计是主观的,并且在很大程度上取决于你试图解决的问题

我的CompanyModel和ContactModel与您的第二个实现相匹配,尽管第一个/第三个实现在内存方面效率最高。我之所以使用第二个实现,只是因为我在MVC页面和WebAPI控制器上共享了我的模型。有了CompanyModel,我就可以在编写Razor时访问公司信息。但是,如果您不编写Razor(或者像我一样随着时间的推移意识到您更喜欢使用JavaScriptMVC/MVVM框架,如AngularJS或JSViews),那么在第一个/第三个实现中编写Razor最有意义。对我来说,第二个实现允许我在需要时加载CompanyModel,在不需要时将其保持为null。(仅仅因为我的编码风格已经改变,我就不重构代码,这是我的一点理由。)