2012-02-01 50 views
1

我有两个表,Users和TempUsers,我需要对它们进行操作。我已经定义了我的用户类型,并且我想将它添加到这两个表的DbContext中。问题是,它使用约定将类型名映射到表或使用TableAttribute和指定的表名。无论哪种方式,我看不出如何添加两个映射类型到不同的表名称的dbset。在EF Code First中对两个相同的表使用相同的类型

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

建议将不胜感激。谢谢!

[说明基于评论]

我之所以有两个表是因为TempUsers是支持批量导入/更新,但尽管原子事务上的每个用户。所以外部的某些活动目录导出或某些这样会导致为每个用户调用服务。我必须创建/更新用户,并找出哪些未被导入但已经存在于我的数据库中,然后删除它们。截断用户表格并直接写入该表格会简单得多,但是Id会不同,并且会破坏用户对不同表格的所有链接,例如发货历史记录。

+2

如果'Users'和'TempUsers'表是完全相同的并且意图如此,那么将它们放在两个单独的表中开始看起来似乎不是一个好设计。为什么不用'IsTemporary'字段的'Users'表。看来这种方法可以解决您在问题中提到的所有问题。 – Yakimych 2012-02-01 10:49:46

+0

为什么不在类上使用布尔值或枚举属性来分类用户是否是临时的? – jmpcm 2012-02-01 10:50:13

+0

我同意IsTemp col是最好的方法。实际上,EF Code First的最新版本通过添加“Discriminator”col或类似的东西来实现这一点。但是,我正在处理这种情况,我必须拥有两个不同的表格,因为我正在处理供应商的应用程序,这是我无法控制的,并且它不够聪明,无法检查IsTemp列。但是我可以配置两个场景来使用两个差异表。 在这种情况下,我认为基类是最好的选择。通过对基类进行编码,您仍然可以在95%的代码中获得两倍的回报。 – Sean 2013-07-11 22:54:11

回答

3

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

相关问题