EF Core:检查 OnModelCreating 中是不是存在列以忽略属性

Posted

技术标签:

【中文标题】EF Core:检查 OnModelCreating 中是不是存在列以忽略属性【英文标题】:EF Core: Check if a column exists in OnModelCreating in order to ignore propertyEF Core:检查 OnModelCreating 中是否存在列以忽略属性 【发布时间】:2022-01-14 11:20:54 【问题描述】:

我们有一列可能存在也可能不存在于表中。如果它不存在,我们希望调用 Fluent API 忽略命令:

modelBuilder.Entity().Ignore(c => c.FullName);

问题是在 OnModelCreating 的范围内确定列是否存在,然后再决定忽略。

我看过这个解决方案:Entity Framework check if column exists during OnModelCreating

它利用了 Database.Connectionstring 属性,但它在 Core 上不可用,如果您使用 Database.GetConnection().ConnectionString,那么它会由于在模型创建期间尝试使用 DbContext 而失败。

如何从这里访问我需要的连接字符串?是否有其他方法来检查列是否存在?

【问题讨论】:

【参考方案1】:

没有使用 DbContext 实例的好方法。

而是从配置中访问连接字符串并使用 DbConnection 直接查询数据库以确定该列是否存在。您可以在启动时执行此操作,或者在启动时注入一个单独的服务,该服务可以访问数据库元数据并在 OnModelCreating 中驱动条件流式配置。

【讨论】:

【参考方案2】:

ConfigurationManager.ConnectionStrings 应该公开它。

如果列可能存在或不存在,您需要确保它永远不会在像Where 甚至Select / ProjectTo 子句这样的查询表达式中使用。这些仅在列存在并已映射时才有效,因此如果您确实想在 Select 投影中使用它,您几乎需要将其视为已忽略或分散的条件逻辑。

删除它并在视图模型中将其保留为计算值可能更可靠,并为所需格式提供可配置选项(例如姓氏、名字与名字姓氏,如果这适用于人名),然后处理插入/更新作为一个单独的条件操作,带有一个配置为在类上使用它的有界 DbContext 实例。这甚至可以在 DbContext SaveChanges 覆盖上进行处理,以便可以拦截更新或插入,从初始 DbContext 中丢弃,如果该客户端正在使用该列,则由有界 DbContext 完成。 (在处理 FullName 是不可为空的列的插入的情况下是必需的)

【讨论】:

以上是关于EF Core:检查 OnModelCreating 中是不是存在列以忽略属性的主要内容,如果未能解决你的问题,请参考以下文章

EF Core:检查 OnModelCreating 中是不是存在列以忽略属性

EF CORE PostgreSQL - 检查列表的所有元素是不是包含在另一个列表中

EF Core 5检查过滤器中的所有ID是不是存在于相关实体中

如何在 EF Core Code First 中自定义迁移生成?

如何优雅地处理 EF Core 异常

如何编写此扩展方法以由 EF Core 转换为 SQL Server?