【问题标题】:Is it possible to create an association between two normal fields in Entity Framework, thereby ignoring the primary key?是否可以在实体框架中的两个普通字段之间创建关联,从而忽略主键?
【发布时间】:2010-08-27 16:46:00
【问题描述】:

我在这三个表之间有以下情况:

在我开始解释我在这里要完成的工作之前,让我先澄清三件事:

  1. 我在 EntityFramework 上绘制了模型,但这实际上是数据库视图。只需假设表之间的字段类型匹配即可;

  2. 我知道这个数据库模型很烂。但改变它是不可能的。我知道这会让我的生活更轻松。

  3. 我在这个项目中使用 Visual Studio 2008 和 .Net 3.5。但我也接受基于 Visual Studio 2010 和 .Net 4.0 的解决方案。

所以,正如我试图在上图中演示的那样,在我正在处理的这个项目中,我得到了这 3 个表。其中之一,TransactionLine,将文件与作为完整事务的一部分的事务行相关联。

现在,我要在这里关联的是 TransactionLineFile。但是,TransactionLine 没有 File 表中的 FileId 字段。此表中的字段 FileNumberFileType 代表 File 上的复合键。事实上,FileFileNumberFileType 永远不会重复。它们可能是主键,但话又说回来,我无法触及数据库结构。

我尝试通过创建一个 Association 的一对多 From File to 交易线。之后,我选择 Association 并切换到 Mapping Details 屏幕,然后选择 Map's to TransactionLine em>

他让我在模型屏幕上填写的数据是:

  • 文件FileId
  • TransactionLine.TransactionId;
  • TransactionLine.FileNumber;
  • TransactionLine文件类型

所有 TransactionLine 标量属性均由其对应的数据库字段设置,它们具有相同的名称。但是,当我要指定与 File 表的链接时,我可以指定的唯一标量字段是 FileId,我在 上没有此字段>TransactionLine 表格。

我还尝试将 FileFileNumberFileType 标量属性实体键标志设置为 true,以及 FileId em> 实体标志为假,但没有成功,因为程序警告我数据库 FileId 是一个主键,但没有像实体上的那样设置。

是否可以将 TransactionLine FileNumberFileTypeFile 联系起来?这种情况有什么解决办法吗?

特别说明: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


【解决方案1】:

我们实现了我们的目标:D。

感谢博士。 Wily 的学徒 为我们提供了有关解决方案的提示。

这是我们所做的:

  1. 我们创建了一个名为 VIEWFILEEXTRA 的视图,其中仅包含我们希望在关联中使用的字段;

  2. 之后,我们基于这个视图创建了一个实体,命名为FileExtra;

  3. 将 FileExtra 映射到 VIEWFILEEXTRA(如果尚未完成);

  4. 将 FileNumber 和 FileType 从 FileExtra Entity Key 标志更改为 true;

  5. 从 File 中删除 FileNumber 和 FileType 标量属性;

  6. 在文件和 FileExtra 之间创建一对一关联;

  7. 将关联映射中的标量属性设置为指向 File 的数据库字段 FileNumber 和 FileType;

  8. 在 FileExtra 和 TransactionLine 之间创建一对多关联;

  9. 将关联映射指向TransactionLine,并设置字段。

就是这样。非常感谢您的关注和提示:D。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多