可变多场键EF关联?

时间:2010-12-08 20:58:43

标签: c# entity-framework

我有几个使用多字段密钥相关的表,但根据应用程序的部署位置,密钥可能不同。

例如:

-Customer-     -Rep-
CompanyID      CompanyID
StoreID        StoreID
RepID          RepID
CustID  

在某些部署中,通过加入CompanyID,StoreID,RepID来识别Rep的客户。在其他部署中,Rep的StoreID将是一串空白,然后连接在CompanyID,RepID上。客户仍将拥有StoreID中的值。

在SQL中我只是将'OR StoreID =“”放在我们加入StoreID字段的地方,但我不知道如何使用实体框架来实现这一点。

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

编辑:

看起来我可以使用MetadataWorkspace即时创建必要的关联。我会调查一下。

编辑:

这种问题可以通过将模型拆分为使用不同的csdl文件(其中定义关联)来解决,具体取决于所需的行为。请参阅MerickOWA的答案和链接的MSDN文章。这引入了一些小麻烦,主要是设计者不支持它,因此您将被简化为编辑XML文件,并且您还必须控制使用哪个csdl资源。 csdl在EF连接字符串中指定,默认情况下位于app.config中。为了简化管理这个字符串(我还需要控制数据库连接字符串),我编写了一个实用程序类来构建我的EF连接字符串。我将此课程基于Fixing the Config: Using Entity Framework in shared libraries中找到的代码。

2 个答案:

答案 0 :(得分:1)

您可能会考虑的一种可能性是尝试将edmx文件拆分为CSDL,SSDL和MSL的子部分。

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

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

我没有很多使用这种先进情况的经验但似乎有可能。

查看MSDN

上的这篇文章

答案 1 :(得分:0)

我同意RPM1984,如果你不小心,你最终会遇到维护噩梦 - 也许你应该考虑在所有三个cols上放置外键但是允许StoreId为null然后考虑在你的模型中使用继承定义映射到表的实体 - 然后为Customer&扩展该实体。在各自的类中代表并包含特定于每个类的业务逻辑......