gpt4 book ai didi

c# - OData 只读属性

转载 作者:IT王子 更新时间:2023-10-29 04:44:30 24 4
gpt4 key购买 nike

我有一个带有 OData V4 的 WebAPI 2.2 应用程序。我也在使用 EF 6.1。

在我的一个实体中,我有一个计算属性:


public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }

// Calculated Property - No setter
public string FullName
{
get { return FirstName + " " + LastName; }
}
}

为了向我的客户提供计算的属性,我需要在 OData 模型中注册

public static IEdmModel GetModel() 
{
ODataModelBuilder builder = new ODataConventionModelBuilder();

builder.Namespace = "NavigationServices";
builder.EntityType<Person>;
builder.EntityType<Person>()
.Property(a => a.FullName); // Calculated Property

return builder.GetEdmModel();
}

因此,当我在客户端获取数据时,每个对象都具有 Calculated 属性。

但是,当我尝试创建 (POST) 一个新元素或更新 (PUT) 一个现有元素时,我的操作无法识别该元素并生成一个错误,指出它找不到用于的“设置方法”属性(property)。

我阅读了几篇关于 OData 中只读属性的文章(显然不受支持),但我没有找到将 OData 与计算属性一起使用的方法。

关于如何克服这种情况的一些建议?

最佳答案

现在有一种软方法可以做到这一点,即使用注释在客户端和服务器之间建立契约。

Core vocabulary of the V4 standard ,有这样一个词:

<Term Name="Computed" Type="Core.Tag" DefaultValue="true" AppliesTo="Property">
<Annotation Term="Core.Description" String="A value for this property is generated on both insert and update"/>
</Term>

在 Web API OData 中,在 WebConfig.cs 中,您编写这样的代码以将这样的注释添加到您的属性中:

ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
var model = builder.GetEdmModel() as EdmModel;
model.SetVocabularyAnnotation(
new EdmAnnotation(model.EntityContainer.FindEntitySet("People").EntityType().FindProperty("FullName"),
new EdmTerm("Org.OData.Core.V1", "Computed", EdmPrimitiveTypeKind.Boolean),
new EdmBooleanConstant(true)));

然后在你的数据中,它看起来像这样:

<Annotations Target="V4Service.Models.Person/FullName">
<Annotation Term="Org.OData.Core.V1.Computed" Bool="true"/>
</Annotations>

通过上述步骤,服务通告 Person 实体的 FullName 属性由服务计算。然后在 POST 和 PATCH 请求的 Controller 方法中,您可以拥有自己的逻辑,忽略客户端为 FullName 属性发送的任何值并计算您自己的值。

我不确定您使用的是哪个客户端。如果您使用 OData Client for .NET ,我们将在下一个版本中支持获取注释值。如果你不介意使用 EdmLib直接,已经添加了注释值检索支持。

关于c# - OData 只读属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27277306/

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