我的解决方案的最佳实践

时间:2009-12-27 17:08:38

标签: c# asp.net linq-to-sql

我问过这个问题What is the best way to dynamic load connection strings

但也许最好问这个问题有点不同。

我有一个CRM解决方案,每个公司都有不同的SQL数据库,但我想尝试只有一个IIS站点,因为除了Web.config文件中的SqlConnectionString之外,站点总是相同的。我使用LinqToSql并使用VS2008中的工具自动生成类。这意味着我有自动生成的DataClasses。我发现这个类从这行中的web.config读取连接字符串:

public DataClassesDataContext() : 
    base(global::System.Configuration.ConfigurationManager
             .ConnectionStrings["TheConnectionString"].ConnectionString,
             mappingSource)
{
    OnCreated();
}

用户都登录到我希望对AD进行审核的同一个IIS站点,然后将它们重定向到CRM站点,当我这样做时,我想动态获取正确的ConnectionString并使Linq类使用它。

我是否在正确的轨道上实现这一目标?如果是这样,我如何实现为linq类加载连接字符串动态,找到上面代码的文件是自动生成的,并在每次编译时删除。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

如果在linqmetal desinger中点击它然后在sql连接的属性窗口中设置为空白,那么你可以这样做,所以自动生成不会让你编写代码。 然后为datacontex创建部分类,然后通过自己的示例创建此构造函数:

 public partial class DataClassesDataContext
    {
        public DataClassesDataContext()
            : base(StaticMethodThatYouDoLogicForConnStringDecision(), mappingSource)
        {

        }
    }

答案 1 :(得分:1)

对于ADO实体和Linq-toSQL,(生成的)datacontext类都有一个接受ConnectionString的重载。

因此,每次创建上下文时都必须添加几个步骤:

string myConnectName = Lookup[Session.ConnectName]; // or something

var rootWebConfig = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~");
var connString = rootWebConfig.ConnectionStrings.ConnectionStrings[myConnectName];

var context = new MyDataContext(connString.ConnectionString);