Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 首先对EF代码中的两个相同表使用相同的类型_C#_Entity Framework - Fatal编程技术网

C# 首先对EF代码中的两个相同表使用相同的类型

C# 首先对EF代码中的两个相同表使用相同的类型,c#,entity-framework,C#,Entity Framework,我有两个表,Users和TempUsers,我需要对它们进行操作。我已经定义了users类型,我想将其添加到两个表的DbContext中。问题是,它要么使用约定将类型名映射到表,要么使用指定表名的TableAttribute。无论哪种方式,我都看不到如何添加两个将类型映射到不同表名的数据库集 我可以使用copy+paste或者通过一个UserBase类和两个派生的User和TempUser类来复制该类型。这两种方法都可以,但实际上在代码中,我想与用户打交道,而不是像代码中的用户和临时用户那样复杂

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

我可以使用copy+paste或者通过一个UserBase类和两个派生的User和TempUser类来复制该类型。这两种方法都可以,但实际上在代码中,我想与用户打交道,而不是像代码中的用户和临时用户那样复杂。毕竟,存储库负责处理用户对象的放置位置,业务逻辑不必处理它

如蒙指教,不胜感激。谢谢

[基于评论的解释]


我之所以有两个表,是因为TempUsers支持批量导入/更新,但在每个用户上支持原子事务。因此,在外部,一些active directory导出或类似的导出将导致为每个用户调用服务。我必须创建/更新用户,找出哪些用户没有被导入,但已经存在于我的数据库中,然后将其删除。截断用户表并直接写入该表会简单得多,但Id会不同,它会断开用户与不同表的所有链接,例如配送历史记录。

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

这让我想起了我自己的问题:


实际上,您可以使用EF和
ExecuteStoreQuery
来检索对象,但是您不能使用EF的LINQ功能。

如果
用户
临时用户
表完全相同,并且应该完全相同,那么将它们放在两个单独的表中似乎不是一个好的设计。为什么不在
Users
表中添加一个
istemporation
字段呢。这种方法似乎可以解决您在问题中提到的所有问题。为什么不在类上使用布尔或枚举属性来分类用户是否是临时用户?我同意IsTemp col是最好的方法。事实上,最新版本的EF代码首先通过添加“鉴别器”列或类似的内容来实现这一点。但是,我的工作环境是必须有两个不同的表,因为我处理的是一个我无法控制的供应商应用程序,而且检查IsTemp列不够智能。但是我可以配置两个场景以使用两个不同的表。在这种情况下,我认为基类是最好的方法。通过对基类进行编码,您仍然能够在95%的代码中获得双倍的回报。