c# - EF Core 自定义属性不适用于 modeBuilder.Model.GetEntityTypes() 上的对象类型
问题描述
我有一个自定义属性类定义如下:
[AttributeUsage(AttributeTargets.All, Inherited = false, AllowMultiple = true)]
public class JsonFieldAttribute : Attribute
{
public JsonFieldAttribute()
{
}
}
通过使用反射在任何类上获取此属性用法都非常完美。没有什么花哨。
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
[JsonField]
public string Primitive { get; set; }
[JsonField]
public Address NonPrimitive { get; set; }
}
但是通过在 DbContexts 的 OnModelCreating 上使用 modeBuilder.Model.GetEntityTypes() 仅适用于原始类型。似乎任何类类型都被忽略了。
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
foreach (var entityTypes in modelBuilder.Model.GetEntityTypes())
{
foreach (var property in entityTypes.GetProperties())
{
var memberInfo = property.PropertyInfo ?? (MemberInfo)property.FieldInfo;
if (memberInfo == null)
{
continue;
}
var attr = Attribute.GetCustomAttribute(memberInfo, typeof(JsonFieldAttribute));
// I've tried various combinations here, but all of them failed
// var attr = memberInfo?.GetCustomAttribute<JsonFieldAttribute>();
if (attr == null)
{
continue;
}
Console.WriteLine($"Custom attribute {property.Name} {attr.GetType().Name}");
}
}
}
输出包含以下内容:
自定义属性 Primitive JsonFieldAttribute
我正在使用 .NET Core 2.1.403 并打包 Microsoft.AspNetCore.All v 2.1.5。知道为什么 NonPrimitive 不起作用吗?
解决方案
这是因为 EF Core 术语的集合和实体(拥有或常规)类型(换句话说,导航属性)不是属性,而是导航,并且不包含在GetProperties
方法结果中,而是可以使用GetNavigations方法检索。
由于IProperty
和INavigation
共享一个共同的基础IPropertyBase
,您可以将它们与Concat
方法结合起来并像这样更改您的循环:
foreach (var property in entityTypes.GetProperties()
.Concat<IPropertyBase>(entityType.GetNavigations()))
{
// ...
}
推荐阅读
- visual-studio - docker-compose 在 PowerShell 中正常工作,但在 Visual Studio 中不能正常工作
- makefile - 为什么 make 在一个循环中运行一个特定的规则 3 次?
- docker - 无法从 NGC TensorFlow 容器执行 DLProf
- java - 如何在多个 Spring Boot 存储库实例之间切换
- python - 无法在本地和 docker 中启动 `django` 项目
- javascript - 使用 OAuth 时,我可以保护客户端上的 API 密钥吗?如果没有,会有风险吗?
- c++ - 链接列表的冒泡排序无法正常工作
- python - 如何在任务栏中将图标设置为 kivy 应用程序?
- javascript - 将 JSON 转换为 JQuery 数据表
- c - 声明一个变量并在编译时将其添加到数组中