C# 将具有忽略属性的复杂类型发布到具有多个参数的OData操作

C# 将具有忽略属性的复杂类型发布到具有多个参数的OData操作,c#,asp.net-web-api,odata,asp.net-web-api-odata,C#,Asp.net Web Api,Odata,Asp.net Web Api Odata,我有以下ODataBuilder配置。它定义了一个带有几个参数的动作Create。请注意,我忽略属性Password。那以后很重要 var userEntitySetName = nameof(UsersController).Replace("Controller", string.Empty); var users = builder.EntitySet<User>(userEntitySetName); users.EntityType.HasKey(x => x.Id)

我有以下ODataBuilder配置。它定义了一个带有几个参数的动作
Create
。请注意,我忽略属性
Password
。那以后很重要

var userEntitySetName = nameof(UsersController).Replace("Controller", string.Empty);
var users = builder.EntitySet<User>(userEntitySetName);
users.EntityType.HasKey(x => x.Id);
users.EntityType.Ignore(x => x.Password);

var userCreateAction = users.EntityType.Collection.Action("Create").ReturnsFromEntitySet<User>(userEntitySetName);
userCreateAction.Parameter<int>("number");
我的控制器操作

[ODataRoute("Users/Create")]
public IHttpActionResult PostCreate(ODataActionParameters parameters)
{
    // omitted
}
我的请求有效负载

{
    "number": 1,
    "user":{ "FirstName": "foo", "LastName": "bar", "Password": "123" }
}
当我发布上述请求时,
参数
null
。但是,如果我在没有忽略属性
Password
的情况下发布它,那么它将按预期工作

在这里,我假设使用
EntityParameter
将使用OData生成器定义的
User
实体。没有
密码
属性的。 而
参数
将使用实际的
用户
类型,包括
密码
属性。允许我做上述要求

但事实并非如此:(

所以我对
参数
实体参数
之间的区别感到困惑。有人能解释一下它们的预期用途吗

但请坚持,还有更多。 这就是我真正困惑的地方

如果我将我的操作的参数数量减少到只有复杂的
用户
类型,并将我的控制器操作更改为:

[ODataRoute("Users/Create")]
public IHttpActionResult PostCreate(User user)
{
    // omitted
}
然后我可以使用
Password
属性执行POST请求。请注意,它不再包装在另一个对象中

{ "FirstName": "foo", "LastName": "bar", "Password": "123" }
这很好。但我需要额外的参数:(

我想真正的问题可以归结为:“如何将忽略的属性发布到我的多参数操作?”

谢谢


更新

我再也不能用
密码
来写这篇文章了。我肯定我之前已经写过了。所以请保留最后一部分。

问题仍然有效:)

第一个问题:EntityParameter还添加了一个非绑定实体类型参数。如果添加了绑定实体类型,则表示将此操作绑定到实体或entityset,请参阅函数:SetBindingParameter


那么,为什么要使用
参数
函数来获取密码属性呢?这是因为当您调用
参数
时,我们将在您的模型中搜索
用户
复杂类型和基元类型,但我们无法获取它,因此我们使用具有
密码的CLR类型为您的
用户
类型构建一个复杂类型属性,并使用<代码> eTyType < /Cult>函数将获得不具有<代码>密码属性的<<代码>用户< /代码>实体类型.

这正是我所期待的.为什么它不起作用?当我用密码发送用户实体时,ODATAcAcOngPosits对象是NULL .即使我使用了非绑定PARameter.因为在EDM模型中,用户没有密码属性,我一定是误解了你所说的。因此,不可能让
ODataActionParameters
正确映射
user
与被忽略的
password
属性?忽略密码并想要获取密码是不对的,此功能是否有助于您在Get中删除密码并将其保留在模型中?我阅读了链接,但没有找到任何与我的问题相关的内容。我还认为您误解了我的意图。我不想
获取密码。我想
发布密码。但我不能使用
User.password
属性,因为当我在json中包含密码时有效负载
ODataActionParameters
null
,因为它认为
用户
有效负载不正确。
{
    "number": 1,
    "user":{ "FirstName": "foo", "LastName": "bar", "Password": "123" }
}
[ODataRoute("Users/Create")]
public IHttpActionResult PostCreate(User user)
{
    // omitted
}
{ "FirstName": "foo", "LastName": "bar", "Password": "123" }