Asp.net web api 防止在POST调用中指定id

Asp.net web api 防止在POST调用中指定id,asp.net-web-api,asp.net-web-api2,Asp.net Web Api,Asp.net Web Api2,我希望通过WebAPI中的POST调用创建EF实体 控制器方法应类似于: [ResponseType(typeof(entity))] public IHttpActionResult Post(entity e) { ... } 其中,实体类包含作为自动递增主键的ID的属性 我不希望使用具有ID属性集的实体对象调用Post方法 有什么方法可以阻止包含主键的创建对象的发布?让我看看我是否正确理解您的意思。。。您想: 向Web API服务发布 传递一个完整的预填充EF实体,不将ID字段作为

我希望通过WebAPI中的POST调用创建EF实体

控制器方法应类似于:

[ResponseType(typeof(entity))]
public IHttpActionResult Post(entity e)
{
   ...
}
其中,
实体
类包含作为自动递增主键的
ID
的属性

我不希望使用具有
ID
属性集的实体对象调用
Post
方法


有什么方法可以阻止包含主键的创建对象的发布?

让我看看我是否正确理解您的意思。。。您想:

  • 向Web API服务发布
  • 传递一个完整的预填充EF
    实体
    ,不将ID字段作为参数,并且
  • 返回同一实体,并在从数据库中分配自动递增值后填充ID字段
  • 如果以上听起来至少与你想要的很接近,那么我会说这是一个常见的问题,但你正在以一种不寻常的方式来处理它

    假设您的
    实体
    如下所示:

    public class entity
    {
        public long ID { get; set; }
        public string firstname { get; set; }
        public string lastname { get; set; }
    }
    
    现在,让我解释一下我看到的选项:

  • 如果您的
    实体
    对象如上所述非常简单,那么您可以通过向方法定义中的所有参数添加
    [FromUri]
    属性来传递URI中的
    firstname
    lastname
    参数,并调整客户端代码以将此信息作为URI中的查询字符串传递

  • 如果您的
    实体
    对象比我上面简单的示例复杂得多,那么您可以创建一个DTO(数据传输对象),其中包含您需要传递到数据库的所有EF模型参数,以创建
    实体
    ,但
    ID
    除外,也就是说,在这种情况下,只需
    firstname
    lastname
    ,并将其作为(
    [FromBody]
    )参数传递给
    Post
    方法,然后调整客户端代码以在请求正文中传递此信息(可能是简单的JSON)


  • 然后,您可以只从数据库返回自动递增的ID,而不是返回整个
    实体
    ,因为您已经拥有所有其他信息(因为您已经将其作为参数传递给了服务的
    Post
    方法!)。

    您想要什么体验?是否要将错误返回给客户端,还是要忽略id属性?我认为错误是可以的。这不是一个普遍的问题吗?如果不常见,我可能做错了什么。我想我不该揭露这门课。