【发布时间】:2019-08-28 18:05:30
【问题描述】:
我有一堆模型都使用了我创建的一个类。它们具有Measurement 类型的属性。这个Measurement 类本身并不是我想要映射到数据库表的实体或模型。它只是一种用于成对传递值和单位的类型,以及用于管理对这些值和单位的操作的一堆方法和运算符。
我创建了一个ValueConverter,这样我就可以在我的模型中将这种类型的属性表示为数据库中的字符串。
ValueConverter<Measurement, string> measurementConverter = new ValueConverter<Measurement, string>
(
v => v.ToString(),
v => new Measurement(v)
);
然后,我的计划是,在我的DbContext 中的OnModelCreating() 方法中,循环遍历我的所有实体及其属性,如果它们属于Measurement 类型,则对它们使用property.SetValueConverter(measurementConverter);。这样,我的模型中的所有测量值都将能够自动保存到数据库并从数据库中加载,并且我不必在我的模型中保留额外的字符串表示字段。
这是我正在谈论的循环:
foreach (var entity in modelBuilder.Model.GetEntityTypes())
{
foreach (var property in entity.GetProperties())
{
if(property.ClrType == typeof(Measurement)) { property.SetValueConverter(measurementConverter); }
}
}
问题在于GetProperties() 方法。它的文档摘要是这样说的:
此 API 仅返回标量属性,不返回导航属性
结果是它根本没有返回我的Measurement 属性。我相信 Entity Framework 认为 Measurement 类实际上是它自己的模型,所以它不会把它当作一个普通的属性来对待。当然,这意味着 ValueConverter 永远不会设置在它上面,并且整个解决方案不能按照我想要的方式工作。
我的第一个想法是将Measurement 类改为结构,因为它已经是不可变的,并且没有真正的理由为什么它不能成为一个结构。这不会让实体框架清楚这是一个标量属性,应该包含在GetProperties() 返回中吗?我是这么想的,但显然不是。更改后我仍然得到相同的行为。
我想避免在每个模型中的每个 Measurement 属性上放置一个属性,所以如果有任何方法可以告诉 Entity Framework 所有这些属性实际上都是可绑定的,那就太好了。如果没有,那我该如何标记它们呢?
谢谢。
【问题讨论】:
标签: c# asp.net-core entity-framework-core