gpt4 book ai didi

c# - 使用 oData 忽略 POST 中的 JSON 属性

转载 作者:行者123 更新时间:2023-11-30 23:04:59 26 4
gpt4 key购买 nike

我正在尝试使用 EntityFramework 和 OData v4 构建 API。

问题:我需要一些额外的数据 extraProperty,它们不在我的数据库中以创建新的 Item,但如果我在 POST 调用中向我的 JSON 对象添加一些数据,oData 不会将其识别为 Item

根据 this question,我使用 EntityFrameWork我尝试在我的模型中使用数据注释 [NotMapped].Ignore(t => t.extraProperty);。但 oData 似乎忽略了它。

我从这个 POST 中得到的所有信息,以及这个 extraProperty 是:

Does not support untyped value in non-open type.

代码

我在 POST 调用中发送的 JSON:

{
"name": "John Doe",
"extraProperty": "Random string"
}

$元数据:

<?xml version="1.0" encoding="utf-8"?>
<edmx:Edmx Version="4.0" xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx">
<edmx:DataServices>
<Schema Namespace="MyApi.Models" xmlns="http://docs.oasis-open.org/odata/ns/edm">
<EntityType Name="Items">
<Key>
<PropertyRef Name="id" />
</Key>
<Property Name="id" Type="Edm.Int32" Nullable="false" />
<Property Name="name" Type="Edm.String" Nullable="false" />
</EntityType>
</Schema>
</edmx:DataServices>
</edmx:Edmx>

ODataConfig.cs

namespace MyApi.App_Start
{
public class OdataConfig
{
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
builder.EntitySet<Items>("Items");
config.Count().Filter().OrderBy().Expand().Select().MaxTop(null);
config.MapODataServiceRoute("odata", "odata", builder.GetEdmModel());
}
}
}

Items.cs

[Table("Item.Items")]
public partial class Items
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public Items(){}

public int id { get; set; }

public string name { get; set; }

[NotMapped] // I already tried this, it's not working
public string extraProperty{ get; set; }
}

MyModel.cs

public partial class MyModel: DbContext
{
public MyModel()
: base("name=MyModel")
{

Database.SetInitializer<MyModel>(null);
}

public virtual DbSet<Items> Items{ get; set; }

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// I also tried this but not working
modelBuilder.Entity<Items>()
.Ignore(e => e.extraProperty);
}
}

MyController.cs

public class ItemsController : ODataController
{
private MyModeldb = new MyModel();

// POST: odata/Items
public async Task<IHttpActionResult> Post(Items items)
{
// items is always null when enterring here
// and this condition is always triggered
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}

// Do some stuff with extraProperty here

db.Items.Add(items);
await db.SaveChangesAsync();

return Created(items);
}
}

部分package.config

<package id="EntityFramework" version="6.2.0" targetFramework="net461" />
<package id="Microsoft.Data.Edm" version="5.8.3" targetFramework="net461" />
<package id="Microsoft.AspNet.OData" version="6.1.0" targetFramework="net45" />
<package id="Microsoft.Data.OData" version="5.8.3" targetFramework="net461" />
<package id="Microsoft.OData.Core" version="7.4.1" targetFramework="net45" />
<package id="Microsoft.OData.Edm" version="7.4.1" targetFramework="net45" />

我还想做一个拦截器,在调用 post 之前清除我的 json,但是根据 this question , Web API OData 不支持查询拦截器...

我该如何处理和避免这个错误?我真的需要在 POST 方法中处理 extraProperty,或者至少,就在之前。

最佳答案

在您的 Items 类中,删除 [NotMapped] 属性

public string extraProperty{ get; set; }

并在您的MyModel 类中保留以下代码

modelBuilder.Entity<Items>()
.Ignore(e => e.extraProperty);

[NotMapped] 属性告诉 OData 在序列化和反序列化 Items 类时忽略 extraProperty。但是由于要在ItemsControllerPOST请求中使用,所以在这种情况下不能使用[NotMapped]属性,所以模型绑定(bind)按照您的意愿进行。

关于c# - 使用 oData 忽略 POST 中的 JSON 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49014820/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com