Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.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公开EF6模型子集_C#_Asp.net_Asp.net Mvc_Entity Framework_Asp.net Web Api - Fatal编程技术网

C# 通过WebAPI公开EF6模型子集

C# 通过WebAPI公开EF6模型子集,c#,asp.net,asp.net-mvc,entity-framework,asp.net-web-api,C#,Asp.net,Asp.net Mvc,Entity Framework,Asp.net Web Api,例如,我有一个像这样的EF6模型: class User { public int Id { get; set; } public string Email { get; set; } public string Name { get; set; } public virtual ICollection<ProfileProperty> Properties { get; set; } public virtual ICollection&l

例如,我有一个像这样的EF6模型:

class User
{
    public int Id { get; set; }
    public string Email { get; set; }
    public string Name { get; set; }

    public virtual ICollection<ProfileProperty> Properties { get; set; }
    public virtual ICollection<Book> Books { get; set; }
}

class Book
{
    public int Id { get; set }
    public int Name { get; set }
    public DateTime CreationDate { get; set }
    public long Size { get; set }

    public string ContentPath { get; set }
}
类用户
{
公共int Id{get;set;}
公共字符串电子邮件{get;set;}
公共字符串名称{get;set;}
公共虚拟ICollection属性{get;set;}
公共虚拟ICollection图书{get;set;}
}
课堂用书
{
公共int Id{get;set}
公共int名称{get;set}
公共日期时间创建日期{get;set}
公共长大小{get;set}
公共字符串ContentPath{get;set}
}
现在我想创建一个WebAPI,它允许:

  • 创建新用户
  • 更新用户名
  • 修改用户书籍的列表
但是,这里有一些技巧,不允许我立即使用教程:

  • 有些字段是无关的或机密的,不能通过WebAPI公开,例如:
    User.Id
    User.Properties
    、嵌套的
    User.Books[x].ContentPath
  • 只有一小部分字段是可编辑的(在示例中,
    User.Name
  • 只有一小部分操作(CRUD)可用,因此它不是REST服务
首先想到的是为每个公开的模型创建额外的类。然而,维护它们并编写代码将数据从数据库模型转换到那些WebAPI友好的类,然后再转换回来,这太麻烦了。有没有更简单、更自动化的方法


理想的方法是需要编写尽可能少的冗余代码。也许有一组属性可以标记字段?

您认为应该创建更多的类是正确的。对于每个公开的操作(更改名称、创建用户等),您应该创建一个仅公开所需字段的ViewModel

public class ChangeUserNameViewModel
{
    public int UserId { get; set; }
    public string NewName { get; set; }
}

您可以轻松地将视图模型转换为域模型,然后再使用类似的方法进行转换。

谢谢您的回答。AutoMapper看起来真不错。从它使用反射的假设来看,它不是很慢吗?我从来没有遇到过速度问题。如果你担心的话,你可以使用一些普通的工厂来进行转换。