在表单和上下文之间传递参数

时间:2018-01-03 01:38:29

标签: c# winforms entity-framework

我正在登录屏幕上切换用户数据库但是我遇到一个问题实体只记得它何时第一次得到我设置为空数据库的连接。

 public int DatabaseSelected { get; set; }
 public SourceContext()
    {
        if (DatabaseSelected == 0)
        {
            myUser.MyDatabase = 0;//LETS DEFAULT TO THE FIRST DB ON STARTUP.

        }
           SourceDatabases selectedDb = (SourceDatabases)DatabaseSelected;

        string connstring = SetupConnections(selectedDb);


            this.Connectionstring = _connstring;

  }

在我的登录界面中,我允许用户更改数据库。

enter image description here

现在所有没有实体都需要一个数据库来访问所以我创建了一个名为empty db的空白数据库,它具有相同的结构但没有客户端数据。

我现在面临的问题是如何告诉实体框架在没有强制重置的情况下。我有一个名为

的房产
public int DatabaseSelected { get; set; }

这是在我的代码中共享的,然后当我到达我的上下文时,我将在这里设置数据库:

    public string SetupConnections(SourceDatabases database)
    {
        EntityConnectionStringBuilder efBuilder = new EntityConnectionStringBuilder();

        try
        {

            string metaData = @"res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl";
            string initialcatalog = "";
            const string appName = "EntityFramework";
            const string providerName = "System.Data.SqlClient";

            if (database == 0)//entity framework needs a default blank database to work with as the first call to this context will be on login.
            {

                initialcatalog = "EMPTYDB";
            }
            if (database == SourceDatabases.COASTALCAROLINAPODIATRY)
        {
            initialcatalog = "COASTALCAROLINAPODIATRY";
        }
        if (database == SourceDatabases.COASTALVISIONCARE)
        {
            initialcatalog = "COASTALVISIONCARE";
        }
        if (database == SourceDatabases.ELEANORSAHN)
        {
            initialcatalog = "ELEANORSAHN";
        }

        if (database == SourceDatabases.GLAUCOMACONSULTANTS)
        {
            initialcatalog = "COASTALCAROLINAPODIATRY";
        }

        if (database == SourceDatabases.MARIANNEROSEN)
        {
            initialcatalog = "COASTALCAROLINAPODIATRY";
        }
        const string dataSource = "sourcenet";
        SqlConnectionStringBuilder sqlBuilder = new SqlConnectionStringBuilder();
        sqlBuilder.DataSource = dataSource;
        sqlBuilder.InitialCatalog = initialcatalog;
        sqlBuilder.MultipleActiveResultSets = true;
        sqlBuilder.IntegratedSecurity = false;
        sqlBuilder.UserID = "scheduler";
        sqlBuilder.Password = "BORG8472";
        sqlBuilder.ApplicationName = appName;


        efBuilder.Metadata = metaData;
        efBuilder.Provider = providerName;
        efBuilder.ProviderConnectionString = sqlBuilder.ConnectionString;


            using (EntityConnection conn =
                new EntityConnection(efBuilder.ToString()))
            {
                conn.Open();
                Console.WriteLine("Just testing the connection.");
                conn.Close();
            }
        }
        catch(Exception EX)
        {

        }
        return efBuilder.ToString();
    }

但由于某种原因,它总是位于emptydb连接字符串中。我知道大多数应用程序通常会重新启动并将此值放在ini文件中,但在2018年是最好的方法吗?

1 个答案:

答案 0 :(得分:0)

虽然我无法回答为什么你不能在你的表单和代码之间传递参数,因为你没有提供任何代码样本,我可以尝试引导你进入the correct way of handling multiple contexts而不会头痛。

以上链接在ASP.NET项目中对此进行了解释,但重点仍然存在。

首先,您需要一个基本上是数据库模式之间契约的接口。当您需要更改数据库时,可以注入从该接口派生的上下文。

这样,您可以在代码中使用该接口的引用,并从存储库中查询该接口。

我强烈建议您重新构建您的基础架构,它可能会在您的项目发展变得更加复杂的情况下迅速失控。