我有几个使用多字段密钥相关的表,但根据应用程序的部署位置,密钥可能不同。
例如:
-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中找到的代码。
答案 0 :(得分:1)
您可能会考虑的一种可能性是尝试将edmx文件拆分为CSDL,SSDL和MSL的子部分。
CSDL是您的实体对象布局,而您的SSDL是您的表格布局,MSL在两者之间映射。
可能你可以尝试使用一个带有两个或更多SSDL / MSL的CSDL来处理具有不同列布局的数据库。
我没有很多使用这种先进情况的经验但似乎有可能。
查看MSDN
上的这篇文章答案 1 :(得分:0)
我同意RPM1984,如果你不小心,你最终会遇到维护噩梦 - 也许你应该考虑在所有三个cols上放置外键但是允许StoreId为null然后考虑在你的模型中使用继承定义映射到表的实体 - 然后为Customer&扩展该实体。在各自的类中代表并包含特定于每个类的业务逻辑......