【发布时间】:2012-02-01 19:37:55
【问题描述】:
我有两个表,Users 和 TempUsers,我需要对它们进行操作。我已经定义了我的用户类型,我想将它添加到两个表的 DbContext 中。问题是,它要么使用约定将类型名称映射到表,要么使用带有指定表名的 TableAttribute。无论哪种方式,我都看不到如何添加两个将类型映射到不同表名的数据库集。
我可以使用复制 + 粘贴或通过 UserBase 类和两个派生的 User 和 TempUser 类来复制类型。两种方式都可以,但实际上在我想要处理用户的代码中,并且没有代码中用户和临时用户的复杂性。毕竟存储库负责处理用户对象的放置位置,而业务逻辑不应该处理它。
建议将不胜感激。谢谢!
[基于评论的解释]
我有两个表的原因是因为 TempUsers 是为了支持批量导入/更新,但通过每个用户的原子事务。因此,在外部,一些活动目录导出或一些此类将导致为每个用户调用服务。我必须创建/更新用户并找出哪些未导入但已存在于我的数据库中,然后将其删除。截断用户表并直接写入该表会更简单,但 Id 会不同,它会破坏用户与不同表的所有链接,例如运输历史记录。
【问题讨论】:
-
如果
Users和TempUsers表是完全相同的并且本来就是这样,那么将它们放在两个单独的表中似乎不是一个好的设计。为什么没有带有IsTemporary字段的Users表。这种方法似乎可以解决您在问题中提到的所有问题。 -
为什么不在类上使用布尔或枚举属性来分类用户是否是临时用户?
-
我同意 IsTemp col 是最好的方法。事实上,最新版本的 EF Code First 基本上是通过添加“鉴别器”col 或类似的东西来做到这一点的。但是,我在必须有两个不同的表的情况下工作,因为我正在处理我无法控制的供应商应用程序,并且它不够聪明,无法检查 IsTemp col。但是我可以配置两个场景来使用两个差异表。在这种情况下,我认为基类是最好的方法。通过针对基类进行编码,您仍然可以在 95% 的代码中获得双倍的收益。
标签: c# entity-framework