C# 是否可以在实体框架中的两个普通字段之间创建关联,从而忽略主键?

C# 是否可以在实体框架中的两个普通字段之间创建关联,从而忽略主键?,c#,.net,entity-framework,C#,.net,Entity Framework,我在这三张表之间有以下情况: 在我开始解释我试图在这里实现的目标之前,让我澄清三件事: 我在EntityFramework上绘制了模型,但这实际上是数据库视图。只需假设表之间的字段类型匹配 我知道这个数据库模型很糟糕。但改变它是不可能的。我知道这会让我的生活更轻松 我在这个项目上使用VisualStudio2008和.NET3.5。但我也接受基于VisualStudio2010和.NET4.0的解决方案 因此,正如我试图在上图中演示的,在我正在进行的这个项目中,我得到了这3张表。然后,Tran

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

在我开始解释我试图在这里实现的目标之前,让我澄清三件事:

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

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

  • 我在这个项目上使用VisualStudio2008和.NET3.5。但我也接受基于VisualStudio2010和.NET4.0的解决方案

  • 因此,正如我试图在上图中演示的,在我正在进行的这个项目中,我得到了这3张表。然后,TransactionLine中的一个将文件与作为完整事务一部分的事务行相关联

    现在,我试图在这里关联的是TransactionLine文件。但是,TransactionLine没有文件表中的FileId字段。此表中的字段FileNumber和FileType代表文件上的复合键。事实上,文件的文件号和文件类型永远不会重复。它们可能是主键,但我无法触及数据库结构

    我试图通过将一对多的关联从File添加到TransactionLine来关联TransactionLineFile。之后,我选择关联并切换到Mapping Details屏幕,然后选择Map's toTransactionLine

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

    • 文件.FileId
    • TransactionLine.TransactionId
    • TransactionLine.FileNumber
    • TransactionLine.FileType
    所有的TransactionLine标量属性都是由它们对应的同名数据库字段设置的。但是,当我要指定与File表的链接时,我可以指定的唯一标量字段是FileId,而TransactionLine表中没有该字段

    我还尝试将文件的FileNumber和FileType scalar properties entity key标志设置为true,FileId entity标志设置为false,但没有成功,因为程序警告我数据库FileId是主键,但与实体上的设置不同

    是否可以将TransactionLine文件编号和文件类型链接到文件?对于这种情况有什么解决办法吗


    特别注意:FileId确实是文件的主键。其他表通过此字段与之链接。交易线路这里是常识规则的一个例外:(

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

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

    以下是我们所做的:

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

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

  • 将FileExtra映射到VIEWFILEEXTRA(如果尚未完成)

  • 将FileNumber和FileType从FileExtra实体键标志更改为true

  • 从文件中删除FileNumber和FileType标量属性

  • 在文件和FileExtra之间创建1对1关联

  • 将关联映射中的标量属性设置为指向文件的数据库字段FileNumber和FileType

  • 在FileExtra和TransactionLine之间创建1对多关联

  • 将关联映射指向TransactionLine,并设置字段


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

    文件表上的数据库中是否存在文件号和文件类型字段的唯一约束?这不是我的领域,希望其他人能提供更好的信息。我找到了这个答案(),并用谷歌搜索了引用的线程(在谷歌的缓存中).简短的回答似乎是暂时的是,您可以通过修改SSDL欺骗EF,但我认为这对您不起作用,因为您提到已经有其他使用FileId的文件关系,因此如果您更改“主键”SSDL中的文件,然后您将打破这些关系。它们有一个唯一的索引。是的,我们考虑过更改EF模型中的“主键”,但打破其他关系的问题使我们无法使用该解决方案:(您说您不能修改数据库结构……添加一个新表怎么样?您可以添加一个新表(我们称之为FileReference),该表以FileNumber和FileType为主键,并将TransactionLine表链接到该表。您还可以在FileReference上设置一个外键约束,指向文件表上的这两个字段(幸好你已经有了唯一的索引),在文件和文件引用之间建立了1对1的关系。我知道……这是一个丑陋的建议。