我需要针对我无法控制的数据库执行只读查询。我的首选是Linq to SQL,但是我们的Dev,QA和Production环境的列名略有不同。
例如,选择FolderName
列。我们可能有:
Dev: u34_FolderName
QA: u74_FolderName
PROD: u56_FolderName
我想做这样的查询:
var query = from c in DepartmentReviews
where c.FolderName == "Test"
我可以使用实体框架来解决这个问题吗?
什么是潜在的解决方案? 3个组件,每个环境都有1个组件?我可以为这些创建公共接口或基类吗?还是针对这些接口或基类?
答案 0 :(得分:1)
更改架构始终是个问题。虽然我不是在数据库中存储XML的大力倡导者,但您的问题听起来似乎可以使用这种方法。
此解决方案要求您进行一次(并且只更改一次架构)。在您的应用程序中可能/可能不可行。
在您的表中,您可能会有一个唯一标识符列和一个xml列(SQL Server 2005/2008自然支持它)。您可以将其序列化为XML(您可能最终会使用通用的XML Serializer- Serializer<T>
,其类型将在运行时使用反射推断)。反序列化它,你就可以得到你的对象。您可以阅读更多相关信息here。
所以你的查询就像
var myXML = from c in ObjectContext.Table
where c.FolderName == "Test" select MyXmlColumn;
var myType = InferTypeFromConfig();
var serializer = new XmlSerializer<myType>();
var object = (myType )serializer.Deserialize(TheXMLStreamCreatedFrom(myXml));
我的0.02美元
答案 1 :(得分:0)
您可能需要使用XmlMappingSource而不是默认的AttributeMappingSource。使用XmlMappingSource,您可以独立于主应用程序自定义xml文件中的列映射。这应该允许您从dev,qa和production中获得不同的映射。
答案 2 :(得分:0)
您是否考虑过制作自己的数据访问层?如果您的查询仅限于特定的一组案例,那么它将不是一个完全成熟的框架。您将在三个数据库模式的顶部有一个共同的词汇表,并且您将在运行时选择正确的原始列名称。你只是用老式的方式缝合你的问题。
虽然您必须手动编写查询,但如果您的本机数据结构是IEnumerable,那么仍然可以保留LINQ的许多客户端功能。
答案 3 :(得分:0)
使用Entity Framework,您可以在构建时操作EDMX文件,以便为每个环境获得所需的结果,请参阅http://msdn.microsoft.com/en-us/library/cc982042.aspx
例如,您可以创建一个项目,在构建时对适当的环境进行预处理,并将此项目文件包含在MSBUILD中作为构建的第一个项目。
或者您可以生成多个CSDL,MSL,SSDL文件并在运行时在它们之间切换,而不是使用默认行为,即从构建过程中嵌入的资源加载它们。
答案 4 :(得分:0)
在EF 4中,您可以使用当前位于CTP中的Code First轻松完成此操作。