c# - 如何在 ODataConventionModelBuilder 中实现自定义约定
问题描述
当针对 OData v4 服务时,我想在客户端执行字符串长度验证以防止数据往返 API,但是如果信息可以通过 $metadata.xml 传递,我不想手动编码每个输入字段。
事实证明,ODataConventionModelBuilder
确实可以正确解释MaxLengthAttribute
数据类并设置适当的EdmProperty
值,但它没有相应的解释约定StringLengthAttribute
。以下片段$metadata
显示了给定假设类定义的预期输出:
<EntityType Name="NoteType">
<Key>
<PropertyRef Name="Id"/>
</Key>
<Property Name="Title" MaxLength="100" Type="Edm.String"/>
<Property Name="Description" MaxLength="500" Type="Edm.String"/>
<Property Name="Id" Type="Edm.Int32" Nullable="false"/>
</EntityType>
public class NoteType
{
[Key]
public int Id { get; set; }
[StringLength(100)]
public string Title { get; set; }
[MaxLength(500)]
public string Description { get; set; }
}
请注意,
Description
带有注释MaxLengthAttribute
但Title
正在使用StringLengthAttribute
$metadata 中的实际输出不包括MaxLength
属性Title
:
<EntityType Name="NoteType">
<Key>
<PropertyRef Name="Id"/>
</Key>
<Property Name="Title" Type="Edm.String"/>
<Property Name="Description" MaxLength="500" Type="Edm.String"/>
<Property Name="Id" Type="Edm.Int32" Nullable="false"/>
</EntityType>
我无法更改数据类定义,因为它们是从 3rd 方程序集派生的,因此我正在寻找一种通用解决方案,如果数据属性具有定义.MaxLength
StringLengthAttribute
MaxLength
在 EF6 和 EFCore 中,我习惯于实现自定义约定以在 DbContext 中实现业务规则,因为名称中包含约定ODataConventionModelBuilder
一词,我希望能够定义自己的约定并将它们插入管道。但我找不到如何做到这一点的好例子。
解决方案
推荐阅读
- plsql - 为什么我的 plsql 函数返回一个空字符串?
- python - 最小化多对多哈希表中的条目
- python - 按日期过滤 sqlalchemy sqlite datetime 列
- python - 如何像所附图片一样删除 Altair yaxis?
- objective-c - 无法将 ForEach 循环中的元素转换为 NSManagedObject 子类 SwiftUI
- javascript - 为什么我的 ScrollTop 功能不起作用?
- json - NIL 值解码嵌套 JSON - SwiftUI
- ios - Flutter:AVCapturePhotoOutput' 仅适用于 iOS 10.0 或更高版本
- flutter - ConnectionState 在主类中更改两次
- css - 按下按钮时开始动画