【发布时间】:2010-08-27 16:46:00
【问题描述】:
我在这三个表之间有以下情况:
在我开始解释我在这里要完成的工作之前,让我先澄清三件事:
我在 EntityFramework 上绘制了模型,但这实际上是数据库视图。只需假设表之间的字段类型匹配即可;
我知道这个数据库模型很烂。但改变它是不可能的。我知道这会让我的生活更轻松。
我在这个项目中使用 Visual Studio 2008 和 .Net 3.5。但我也接受基于 Visual Studio 2010 和 .Net 4.0 的解决方案。
所以,正如我试图在上图中演示的那样,在我正在处理的这个项目中,我得到了这 3 个表。其中之一,TransactionLine,将文件与作为完整事务的一部分的事务行相关联。
现在,我要在这里关联的是 TransactionLine 和 File。但是,TransactionLine 没有 File 表中的 FileId 字段。此表中的字段 FileNumber 和 FileType 代表 File 上的复合键。事实上,File 的 FileNumber 和 FileType 永远不会重复。它们可能是主键,但话又说回来,我无法触及数据库结构。
我尝试通过创建一个 Association 的一对多 From File to 交易线。之后,我选择 Association 并切换到 Mapping Details 屏幕,然后选择 Map's to TransactionLine em>。
他让我在模型屏幕上填写的数据是:
- 文件。FileId;
- TransactionLine.TransactionId;
- TransactionLine.FileNumber;
- TransactionLine。文件类型,
所有 TransactionLine 标量属性均由其对应的数据库字段设置,它们具有相同的名称。但是,当我要指定与 File 表的链接时,我可以指定的唯一标量字段是 FileId,我在 上没有此字段>TransactionLine 表格。
我还尝试将 File 的 FileNumber 和 FileType 标量属性实体键标志设置为 true,以及 FileId em> 实体标志为假,但没有成功,因为程序警告我数据库 FileId 是一个主键,但没有像实体上的那样设置。
是否可以将 TransactionLine FileNumber 和 FileType 与 File 联系起来?这种情况有什么解决办法吗?
特别说明:FileId确实是File的主键。其他表通过此字段与其链接。这里的 TransactionLine 是常识规则的一个例外。 :(
【问题讨论】:
-
FileNumber 和 FileType 字段在 File 表的数据库中是否存在唯一约束?
-
这不是我的领域,所以希望其他人可以提供更好的信息。我找到了这个答案(stackoverflow.com/questions/1963829/…),并用谷歌搜索了引用的线程(它在谷歌的缓存中)。简短的回答似乎是暂时的,是的,您可以通过修改 SSDL 来欺骗 EF,但我认为这对您不起作用,因为您提到已经有其他使用 FileId 的 File 关系,所以如果您更改“主键” " 的文件在 SSDL 中,那么你会打破这些关系。
-
它们有一个唯一索引。
-
是的,我们考虑过更改 EF 模型中的“主键”,但破坏其他关系的问题使我们无法使用该解决方案:(
-
你说不能修改数据库结构...要不要加个新表?您可以添加一个以 FileNumber 和 FileType 作为主键的新表(我们称之为 FileReference),并将您的 TransactionLine 表链接到该表。您还可以在 FileReference 上放置一个外键约束,指向 File 表上的这两个字段(好在您已经有一个唯一索引),从而在 File 和 FileReference 之间建立一对一的关系。我知道...这是一个丑陋的建议。
标签: c# .net entity-framework