繁体   English   中英

架构:实体框架Web Api

[英]Architecture: entity framework Web Api

我正在使用实体框架创建一个web api程序。 所以作为基础,我有一个sql server数据库,我用实体框架连接到我的web api程序。 使用实体框架的附加组件,我根据我的数据库表生成了类。 但是我不想将这些类用于我的webservices,因为我不需要显示实体框架生成的一些属性,并且对于所有代理问题都有点棘手。 由于外键,特别生成这些属性。 如下所示,对于这个生成的类,我不需要显示“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; }

}

我需要一些建议,以避免在我的Web服务中显示该实体。 我在考虑3种可能性:

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

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

如果您使用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; }
}

这些信息来自这里

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

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

所以,我想说你的选择3是在正确的轨道上。

我可能会创建具有函数的管理类,这些函数可以创建我的Web服务所需的完美对象。 我的意思是将“FonctionnalitePerUser”对象转换为“FonctionnalitePerUserCustom”对象的函数

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM