【问题标题】:Architecture: entity framework Web Api架构:实体框架Web Api
【发布时间】:2014-05-25 13:11:31
【问题描述】:

我正在使用实体框架创建一个 Web api 程序。因此,作为基础,我有一个通过实体框架连接到我的 web api 程序的 sql server 数据库。使用实体框架的附加组件,我根据我的数据库表生成了类。但是我不想将这些类用于我的 web 服务,因为我不需要显示实体框架生成的一些属性,并且对于所有代理问题都有点棘手。这些属性是由于外键而特别生成的。如下,对于这个生成的类,我不需要显示“Societe”对象和“Utilisateur”对象:

 public partial class FonctionnalitePerUser
{
    public int FonctionUserLngId { get; set; }
    public int FonctionUserLngUserId { get; set; }
    public int FonctionUserLngSocieteId { get; set; }
    public virtual Societe Societe { get; set; }
    public virtual Utilisateur Utilisateur { get; set; }

}

我需要一些建议来避免在我的网络服务中显示这些实体。 我在考虑 3 种可能性:

  • 由于它是一个分部类,我可能会创建另一个同名的分部类,在其中放置我需要的属性并覆盖构造函数。
  • 我可能会从该类继承一个自定义类来覆盖构造函数,以便根据需要获得一个结构化的类。
  • 我可能会创建管理类,其功能可以创建我的 Web 服务所需的完美对象。我的意思是将“FonctionnalitePerUser”对象转换为“FonctionnalitePerUserCustom”对象的函数。

这是我找到的 3 个解决方案。为了获得最佳性能,我想知道是否有人可以给我一些建议或提出其他解决方案。 提前致谢

【问题讨论】:

  • 我的第一直觉说;不要将 BE 视为 DTO,反之亦然。 (即使用选项 3)

标签: c# web-services entity-framework asp.net-web-api


【解决方案1】:

一般来说,为 Web 服务 API 公开不同类型的对象而不是持久性通常很有用。这正是您所说的原因:因为您不需要将所有持久性内容暴露给世界其他地方(客户端)。

通常,您会将要从持久性模型(EF 实体等)公开的信息映射到视图模型对象(或 DTO)。

所以,我想说你的选项 3 是正确的。

我可能会使用创建管理类的函数来创建管理类 我的网络服务所需的完美对象。我的意思是功能 将“FonctionnalitePerUser”对象转换为 “FonctionnalitePerUserCustom”对象

有几种工具可以帮助转换映射对象。一个是AutoMapper,它将按照惯例进行映射。这样可以节省很多映射代码。

【讨论】:

  • 好的,谢谢你的回答。我可能会在一段时间内将其标记为“已接受的答案”。如果出现更好的解决方案,请等待新的解决方案!
【解决方案2】:

如果您使用 Newtonsoft Json.NET,我认为这是 MVC5 中的默认设置,那么您可以将属性归因于告诉 newtonsoft 要序列化什么以及忽略什么。

public class Car
{
  // included in JSON
  public string Model { get; set; }
  public DateTime Year { get; set; }
  public List<string> Features { get; set; }

  // ignored
  [JsonIgnore]
  public DateTime LastModified { get; set; }
}

或者,如果您想要忽略的属性多于想要序列化的属性,您可以这样做:

[DataContract]
public class Computer
{
  // included in JSON
  [DataMember]
  public string Name { get; set; }
  [DataMember]
  public decimal SalePrice { get; set; }

  // ignored
  public string Manufacture { get; set; }
  public int StockCount { get; set; }
  public decimal WholeSalePrice { get; set; }
  public DateTime NextShipmentDate { get; set; }
}

此信息取自here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-12
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    • 1970-01-01
    • 2021-05-04
    • 2014-07-17
    • 2020-09-24
    相关资源
    最近更新 更多