我正在使用SubSonic作为我的最新项目。首先要做的事情;这个项目仅限于使用.net 3.0和SubSonic一直很棒。我喜欢它。
但是,我在定制方面遇到了一些麻烦。客户要求我们使用两个SQL Server 2005数据库,其中一个将复制另一个,减去一些列。
乍一看,这似乎毫无疑问。但是,SubSonic默认会抓取所有列,从而导致SQLExceptions。我希望优雅按表格限制表格中的选择列表。例如,以下代码可以解决这个问题,但每次我新建一个查询时我都不想这样做:
Query q = Post.Query().WHERE(Post.Columns.PageId, page_id);
if(UsingReplicatedDB)
q.SetSelectList(ReplicatedPostColumnList);
return q.ExecuteReader();
上面的方法使我的代码膨胀,并且不适用于SubSonic生成的内置FetchByX
方法。有没有办法在逐个表格的基础上优雅地设置默认 SelectList?
我已经尝试在我的部分类中从运行时删除Schema中的列,但是看起来像ColNameColumn
的列在Columns
集合中寻找特定的索引,所以我的计划被挫败了。
请不要“你是个白痴,为什么要这样做?”答案。我知道有很多可能更好的方法,这似乎有点hacky,但这是我的观点。我需要一个没有弊端的解决方案。
答案 0 :(得分:2)
我认为没有一种简单的方法可以让它发挥作用。您可以创建指向每个数据库的两个SubSonic提供程序,然后根据情况使用SubSonic对象填充单独的模型。但是SubSonic不能按照您想要的方式工作,因为它与数据库模式紧密相关。
答案 1 :(得分:0)
这里确实有一个非常棘手的情况。即使您确实找到了一种方法来根据您使用的数据库版本来获取查询列,您现在必须弄清楚您在Bussiness Model或UI中使用的数据库,这样您就不会引用哪些数据库了不存在。
我建议使用两个SubSonic提供程序,然后让Generated类各自实现一个接口,该接口包含两个类共有的列的属性以及您计划用于与数据库交互的Subsonic方法如Save();.
有时,当您想要自定义某些内容时,您需要编写一些自定义代码:)
答案 2 :(得分:0)
如果您愿意使用3.0(即将发布),我很乐意与您合作完成一些TT模板修复(忽略rep列)。在gmail的myname上ping我 - 我一直想这样做:)。
3.0也允许你使用Linq和我们的neq查询工具 - 但是我想确保它不会破坏你正在做的事情。