C# 变量多字段键EF关联?

C# 变量多字段键EF关联?,c#,entity-framework,C#,Entity Framework,我有两个表,它们使用多字段键进行关联,但根据应用程序部署的位置,键可能会有所不同 例如: -Customer- -Rep- CompanyID CompanyID StoreID StoreID RepID RepID CustID 在某些部署中,代表的客户通过加入CompanyID、StoreID和RepID来识别。在其他部署中,代表的StoreID将是一个空格字符串,然后连接在CompanyID上,RepID。客户在StoreID中仍将

我有两个表,它们使用多字段键进行关联,但根据应用程序部署的位置,键可能会有所不同

例如:

-Customer-     -Rep-
CompanyID      CompanyID
StoreID        StoreID
RepID          RepID
CustID  
在某些部署中,代表的客户通过加入CompanyID、StoreID和RepID来识别。在其他部署中,代表的StoreID将是一个空格字符串,然后连接在CompanyID上,RepID。客户在StoreID中仍将有值

在SQL中,我只是在StoreID字段中加入了一个“OR StoreID=”“”,但我不知道如何使用实体框架实现这一点

我可以为每种情况设置一个关联,然后使用适当的关联,但除非在运行时将名称别名为适当的关联,否则这会使应用程序代码有点混乱

编辑:

看起来我可以使用MetadataWorkspace动态创建必要的关联。我将对此进行调查

编辑:


根据需要的行为,可以通过拆分模型来使用不同的csdl文件(定义关联的地方)来解决此类问题。请参阅MerickOWA的答案和MSDN文章链接。这带来了一些小麻烦,主要是设计器不支持它,因此您将不得不编辑XML文件,并且还必须控制使用哪个csdl资源。csdl在EF连接字符串中指定,默认情况下,该字符串位于app.config中。为了简化对该字符串的管理(我需要控制数据库连接字符串),我编写了一个实用程序类来构建EF连接字符串。我把这个类放在我发现的代码中。

< p>我同意RPM1984,如果你不小心的话,你最终会结束一个维护噩梦——也许你应该考虑在所有三个COLs上设置外键,但是允许StoreId是空的,然后考虑在模型中使用继承来定义映射到表的实体。扩展了客户和ReP的实体,包括它们各自类中的每一个业务逻辑。

< P>我同意RPM1984,如果你不小心,你最终会结束一个维护噩梦——也许你应该考虑在所有三个COLs上加上外键,但是允许StoreId是空的,然后考虑使用。在模型中继承以定义映射到表的实体,然后为Customer&Rep扩展该实体,并在其各自的类中包含特定于每个实体的业务逻辑…

您可能会研究的一种可能性是尝试将edmx文件拆分为其子部分CSDL、SSDL和MSL

CSDL是实体对象布局,而SSDL是表布局,MSL在两者之间映射

可能您可以尝试使用一个CSDL和两个或多个SSDL/MSL来处理具有不同列布局的数据库

我没有太多的经验使用这种先进的情况,但它确实似乎是可能的


请在

上查看本文,您可能会研究一种可能性,即尝试将edmx文件拆分为其子部分CSDL、SSDL和MSL

CSDL是实体对象布局,而SSDL是表布局,MSL在两者之间映射

可能您可以尝试使用一个CSDL和两个或多个SSDL/MSL来处理具有不同列布局的数据库

我没有太多的经验使用这种先进的情况,但它确实似乎是可能的


查看这篇关于

的文章,为什么部署会影响数据库的体系结构?没有任何意义。如果不同的客户/部署具有不同的逻辑,那么它应该是独立的表(甚至数据库)。尝试“有条件”引用完整性是没有意义的。应用程序的数据库是从客户端的后端系统提供的,它们有时有稍微不同的数据模型,因此根据我们部署的位置,会有一些差异。数据库不关心我们以何种方式连接表,因此它不会影响数据库设计。我可以使用两个实体模型,并在应用程序启动时选择合适的实体模型。不过,最终可能会成为维护方面的一大难题,因为必须在两个模型中复制更改。如果有一种方法来控制关联的工作方式会更好。为什么部署会影响数据库的体系结构?没有任何意义。如果不同的客户/部署具有不同的逻辑,那么它应该是独立的表(甚至数据库)。尝试“有条件”引用完整性是没有意义的。应用程序的数据库是从客户端的后端系统提供的,它们有时有稍微不同的数据模型,因此根据我们部署的位置,会有一些差异。数据库不关心我们以何种方式连接表,因此它不会影响数据库设计。我可以使用两个实体模型,并在应用程序启动时选择合适的实体模型。不过,最终可能会成为维护方面的一大难题,因为必须在两个模型中复制更改。如果有一种方法来控制协会的运作会更好。我同意,这看起来是一个可行的解决方案。然而,由于在我的模型中只有一个地方有这种特定于部署的细节,所以我希望避免构建两组不同的文件。如果我有很多不同的地方,这可能更吸引人。这是一篇很棒的MSDN文章,谢谢。为了以这种方式解决这个问题,我将创建两个具有两种不同关联的csdl文件。在应用程序启动期间,我将确定哪个是合适的,然后在实例化EF模型时在connectionString参数中指定该csdl。如果您在app.config中分解默认的连接字符串,这会更容易。基于“修复配置:在共享库中使用实体框架”的博客文章,我编写了一个小实用程序类来管理连接字符串。我将把这个链接作为我问题的更新发布。@DaveK,你还可以做些什么