gpt4 book ai didi

c# - Entity Framework 覆盖默认属性约定以忽略属性

转载 作者:太空宇宙 更新时间:2023-11-03 12:47:55 24 4
gpt4 key购买 nike

我正在重写遗留系统以使用 Entity Framework 。旧系统有实体,其中一半属性映射到数据库列,另一半不映射。为了表明必须映射一个属性,该属性用 [Field] 属性修饰。所有其他属性都被忽略。

这与 EF 的做法相反。按照惯例,EF 将所有具有 getter 和 setter 的公共(public)属性映射到数据库字段,除非属性使用 [NotMapped] 数据注释进行修饰,或者在模型创建时使用流畅的 API 为该属性调用忽略。

我想覆盖 EF 约定以作为旧系统工作。即忽略没有 FieldAttribute 的属性。我知道这可以通过将 [NotMapped] 添加到所有属性来完成,但我正在寻找一种动态执行此操作的方法,这样我就不必更改每个实体(有数百个)

据我所知,没有要删除或覆盖的系统约定

https://msdn.microsoft.com/en-us/library/system.data.entity.modelconfiguration.conventions.aspx

我尝试了以下代码来使用反射调用忽略,但没有成功:

modelBuilder.Properties().Configure((configuration) =>
{
var attributes = configuration.ClrPropertyInfo.GetCustomAttributes(inherit: false);
var fieldAttribute = attributes.FirstOrDefault(x => x.GetType() == typeof(FieldAttribute) || x.GetType() == typeof(KeyAttribute));
if (fieldAttribute == null)
{

var entityMethod = modelBuilder.GetType().GetMethod("Entity");
var entityConfiguration = entityMethod.MakeGenericMethod(configuration.ClrPropertyInfo.ReflectedType).Invoke(modelBuilder, new object[] { });
MethodInfo ignoreMethod = entityConfiguration.GetType()
.GetMethod("Ignore")
.MakeGenericMethod(configuration.ClrPropertyInfo.PropertyType);
var parameter = Expression.Parameter(configuration.ClrPropertyInfo.ReflectedType);
var memberExpression = Expression.Property(parameter, configuration.ClrPropertyInfo.Name);
var lambdaExpression = Expression.Lambda(memberExpression, parameter);
ignoreMethod.Invoke(entityConfiguration, new[] { lambdaExpression });
}
});

这看起来可行,因为该属性已添加到实体配置的忽略列表中。但是 EF 仍然尝试将该属性映射到不存在的数据库字段并引发无效列异常。

还有人有其他想法吗?

最佳答案

我找到了解决问题的方法。如果我是从 TypeConventionConfiguration 而不是 PropertyConventionConfiguration 来的,它就可以工作。我上面的代码中可能有一些错误。这样我需要使用更少的反射...

modelBuilder.Types().Configure((entityConfiguration) =>
{
const BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly;
foreach (var propertyInfo in entityConfiguration.ClrType.GetProperties(bindingFlags))
{
var attributes = propertyInfo.GetCustomAttributes(inherit: false);
var fieldAttribute = attributes.FirstOrDefault(x => x.GetType() == typeof(FieldAttribute) || x.GetType() == typeof(KeyAttribute));
if (fieldAttribute == null)
{
entityConfiguration.Ignore(propertyInfo);
}
}
});

关于c# - Entity Framework 覆盖默认属性约定以忽略属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36599816/

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