【问题标题】:Use same type against two identical tables in EF Code First在 EF Code First 中对两个相同的表使用相同的类型
【发布时间】:2012-02-01 19:37:55
【问题描述】:

我有两个表,Users 和 TempUsers,我需要对它们进行操作。我已经定义了我的用户类型,我想将它添加到两个表的 DbContext 中。问题是,它要么使用约定将类型名称映射到表,要么使用带有指定表名的 TableAttribute。无论哪种方式,我都看不到如何添加两个将类型映射到不同表名的数据库集。

我可以使用复制 + 粘贴或通过 UserBase 类和两个派生的 User 和 TempUser 类来复制类型。两种方式都可以,但实际上在我想要处理用户的代码中,并且没有代码中用户和临时用户的复杂性。毕竟存储库负责处理用户对象的放置位置,而业务逻辑不应该处理它。

建议将不胜感激。谢谢!

[基于评论的解释]

我有两个表的原因是因为 TempUsers 是为了支持批量导入/更新,但通过每个用户的原子事务。因此,在外部,一些活动目录导出或一些此类将导致为每个用户调用服务。我必须创建/更新用户并找出哪些未导入但已存在于我的数据库中,然后将其删除。截断用户表并直接写入该表会更简单,但 Id 会不同,它会破坏用户与不同表的所有链接,例如运输历史记录。

【问题讨论】:

  • 如果UsersTempUsers 表是完全相同的并且本来就是这样,那么将它们放在两个单独的表中似乎不是一个好的设计。为什么没有带有IsTemporary 字段的Users 表。这种方法似乎可以解决您在问题中提到的所有问题。
  • 为什么不在类上使用布尔或枚举属性来分类用户是否是临时用户?
  • 我同意 IsTemp col 是最好的方法。事实上,最新版本的 EF Code First 基本上是通过添加“鉴别器”col 或类似的东西来做到这一点的。但是,我在必须有两个不同的表的情况下工作,因为我正在处理我无法控制的供应商应用程序,并且它不够聪明,无法检查 IsTemp col。但是我可以配置两个场景来使用两个差异表。在这种情况下,我认为基类是最好的方法。通过针对基类进行编码,您仍然可以在 95% 的代码中获得双倍的收益。

标签: c# entity-framework


【解决方案1】:

这是不可能的。 EF 不能在同一上下文中两次映射同一类。您的单个 User 类只能映射到单个上下文类型中的 Users 表或 TempUsers 表。您需要两个用户类或两种不同的上下文类型(具有不同的映射配置) - 一种提供对Users 表的访问,第二种提供对TempUsers 表的访问。

【讨论】:

    【解决方案2】:

    这让我想起了我自己的问题:Querying data using Entity Framework from dynamically created table

    其实你可以使用EF和ExecuteStoreQuery来检索对象,但是你不能使用EF的LINQ特性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-15
      • 2012-08-09
      • 2014-12-18
      • 1970-01-01
      相关资源
      最近更新 更多