【问题标题】:Entity Framework not to insert/update certain column ( but still column should be mapped )实体框架不插入/更新某些列(但仍应映射列)
【发布时间】:2015-06-18 17:26:13
【问题描述】:

我知道我可以使用 NotMapped 属性或 Fluent API 从映射中排除列,但这并不是我想要的。

假设我有 Customer 类型的对象,然后我想检查以下内容:

if (customer.UpgradeVersion < 2)   // some condition
{
    context.Entry(customer).Property(c => c.MyProperty).IsModified = false;
}

这将在客户被修改时从UPDATE语句中排除属性,但它不适用于INSERT-s。

理想情况下,我想有条件地为某个对象“取消映射”属性,这样它就不会针对其验证属性等进行插入/更新/验证。

实际上,我可以使用IsModifed 标志覆盖ValidateEntityDbContext + 解决方法更新,但inserts-s 是主要问题...

【问题讨论】:

  • 如果插入新的客户行,数据库表中的属性值应该是多少? DBNull?
  • 如何制作一个自定义属性来处理它?
  • @Alex,关键是数据库表可能根本不包含该列 - 这大致是条件实际检查的内容。因此,INSERT INTO customer(id, ..., MyProperty) 语句将失败,即使参数值为 DBNull。
  • @ggui,我可以举个例子吗?好像我必须覆盖 SQL 生成

标签: c# sql-server entity-framework ef-code-first


【解决方案1】:

我想出了实际使用多个数据库上下文 + 一些流畅的 API。 主要思想是:

  1. 创建一个新的 db-context 并将支持的UpgradeVersion 作为参数传递
  2. 使用 fluent API 和一些反射仅映射具有升级版本的属性 >= SupportedUpgradeVersion 参数

我相信这是实现我想要的唯一方法。你不能用一个单一的数据库上下文来做到这一点。

【讨论】:

    【解决方案2】:

    创建一个分部类并将您想要的附加属性添加到客户实体。这些属性将仅存在于对象级别。你也可以这样添加方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-23
      • 1970-01-01
      • 2021-06-01
      • 2016-02-21
      • 1970-01-01
      相关资源
      最近更新 更多