实体框架覆盖默认属性约定以忽略属性

2023-12-21

我正在重写遗留系统以使用实体框架。旧系统的实体的一半属性映射到数据库列,另一半则没有。为了指示必须映射某个属性,该属性用 [Field] 属性进行修饰。所有其他属性都被忽略。

这与 EF 的做法相反。按照惯例,EF 会将所有带有 getter 和 setter 的公共属性映射到数据库字段,除非该属性使用 [NotMapped] 数据注释进行修饰,或者在模型创建时使用 Fluent API 对该属性调用了 Ignore。

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

我可以看到没有系统约定可以删除或覆盖此内容

https://msdn.microsoft.com/en-us/library/system.data.entity.modelconfiguration.conventions.aspx 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 仍然尝试将属性映射到不存在的 DB 字段并引发 Invalid column 异常。

还有人有其他想法吗?


我找到了解决问题的办法。如果我从 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);
                        }
                    }
                });
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实体框架覆盖默认属性约定以忽略属性 的相关文章

  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • 为什么 GCC 不允许我创建“内联静态 std::stringstream”?

    我将直接前往 MCVE include
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • 用于 FTP 的文件系统观察器

    我怎样才能实现FileSystemWatcherFTP 位置 在 C 中 这个想法是 每当 FTP 位置添加任何内容时 我都希望将其复制到我的本地计算机 任何想法都会有所帮助 这是我之前问题的后续使用 NET 进行选择性 FTP 下载 ht
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • 枚举扩展方法

    在vs2008中 是否可以编写适用于任何枚举的扩展方法 我知道您可以针对特定枚举编写扩展方法 但我希望能够使用单个扩展方法对每个枚举进行处理 这可能吗 是的 只需针对基础进行编码Enum类型 例如 public static void So
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • C++ 继承的内存布局

    如果我有两个类 一个类继承另一个类 并且子类仅包含函数 那么这两个类的内存布局是否相同 e g class Base int a b c class Derived public Base only functions 我读过编译器无法对数
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern
  • 类型或命名空间“MyNamespace”不存在等

    我有通常的类型或命名空间名称不存在错误 除了我引用了程序集 using 语句没有显示为不正确 并且我引用的类是公共的 事实上 我在不同的解决方案中引用并使用相同的程序集来执行相同的操作 并且效果很好 顺便说一句 这是VS2010 有人有什么
  • Mono 应用程序在非阻塞套接字发送时冻结

    我在 debian 9 上的 mono 下运行一个服务器应用程序 大约有 1000 2000 个客户端连接 并且应用程序经常冻结 CPU 使用率达到 100 我执行 kill QUIT pid 来获取线程堆栈转储 但它总是卡在这个位置
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前

随机推荐