我正在使用共享数据库解决方案,我只能访问一个数据库。如何让我的 MVC 应用程序只使用这 1 个数据库来存储它的所有数据?这可能吗?
4 回答
MVC 不需要数据库来运行。您可以编写访问数据库的所有代码,因此您可以完全控制它将访问多少数据库。
通过不使用 Microsoft 提供的任何成员资格、会话和配置文件提供程序,它们创建了自己的名为“aspnet”的数据库。
(需要更改 web.config 文件)
除此之外,StanK 是对的,您可以或者必须自己编写代码。
顺便说一句,如果它不是 Sql-Server 数据库,您可能需要另一个 ado.net 提供程序,而不是构建到 .NET 框架中的提供程序。
这是访问数据库的代码示例:
protected System.Data.Common.DbProviderFactory m_providerFactory = null;
protected System.Data.SqlClient.SqlConnectionStringBuilder m_ConnectionString;
public System.Data.Common.DbProviderFactory GetFactory()
{
System.Data.Common.DbProviderFactory providerFactory = null;
providerFactory = System.Data.Common.DbProviderFactories.GetFactory("System.Data.SqlClient");
return providerFactory;
} // End Function GetFactory
public System.Data.IDbConnection GetConnection()
{
System.Data.SqlClient.SqlConnection sqlc = new System.Data.SqlClient.SqlConnection("ConnectionString");
return sqlc;
} // End Function GetConnection
public System.Data.IDbConnection GetConnection(string strInitialCatalog)
{
if (string.IsNullOrEmpty(strInitialCatalog))
{
return GetConnection();
}
System.Data.SqlClient.SqlConnection sqlc = null;
lock (this.m_ConnectionString)
{
string strOrigInitialCatalog = this.m_ConnectionString.InitialCatalog;
this.m_ConnectionString.InitialCatalog = strInitialCatalog;
sqlc = new System.Data.SqlClient.SqlConnection(this.m_ConnectionString.ConnectionString);
this.m_ConnectionString.InitialCatalog = strOrigInitialCatalog;
strOrigInitialCatalog = null;
}
return sqlc;
}
public override System.Data.IDbCommand CreateCommand()
{
return CreateCommand("");
} // End Function CreateCommand
public override System.Data.IDbCommand CreateCommand(string strSQL)
{
System.Data.IDbCommand idbc = this.m_providerFactory.CreateCommand();
idbc.CommandText = strSQL;
return idbc;
} // End Function CreateCommand
public System.Data.DataTable GetDataTable(System.Data.IDbCommand cmd, string strDb)
{
System.Data.DataTable dt = new System.Data.DataTable();
using (System.Data.IDbConnection idbc = GetConnection(strDb))
{
lock (idbc)
{
lock (cmd)
{
try
{
cmd.Connection = idbc;
using (System.Data.Common.DbDataAdapter daQueryTable = this.m_providerFactory.CreateDataAdapter())
{
daQueryTable.SelectCommand = (System.Data.Common.DbCommand)cmd;
daQueryTable.Fill(dt);
} // End Using daQueryTable
} // End Try
catch (System.Data.Common.DbException ex)
{
//COR.Debug.MsgBox("Exception executing ExecuteInTransaction: " + ex.Message);
Log("cMS_SQL.GetDataTable(System.Data.IDbCommand cmd)", ex, cmd.CommandText);
}// End Catch
finally
{
if (idbc != null && idbc.State != System.Data.ConnectionState.Closed)
idbc.Close();
} // End Finally
} // End lock cmd
} // End lock idbc
} // End Using idbc
return dt;
} // End Function GetDataTable
public override System.Data.DataTable GetDataTable(string strSQL, string strInitialCatalog)
{
System.Data.DataTable dt = null;
using (System.Data.IDbCommand cmd = this.CreateCommand(strSQL))
{
dt = GetDataTable(cmd, strInitialCatalog);
} // End Using cmd
return dt;
} // End Function GetDataTable
用法:
GetDataTable("SELECT * FROM T_User", "DB_NAME");
以及为未注册的提供者获取提供者工厂的代码:
public System.Data.Common.DbProviderFactory GetFactory(Type tAssemblyType)
{
return GetFactory(tAssemblyType.AssemblyQualifiedName);
}
public virtual System.Data.Common.DbProviderFactory GetFactory(string assemblyType)
{
#if TARGET_JVM // case insensitive GetType is not supported
Type type = Type.GetType (assemblyType, false);
#else
Type type = Type.GetType(assemblyType, false, true);
#endif
if (type != null && type.IsSubclassOf(typeof(System.Data.Common.DbProviderFactory)))
{
// Provider factories are singletons with Instance field having
// the sole instance
System.Reflection.FieldInfo field = type.GetField("Instance", System.Reflection.BindingFlags.Public |
System.Reflection.BindingFlags.Static);
if (field != null)
{
return (System.Data.Common.DbProviderFactory)field.GetValue(null);
//return field.GetValue(null) as DbProviderFactory;
}
}
throw new System.Configuration.ConfigurationErrorsException("DataProvider is missing!");
//throw new System.Configuration.ConfigurationException("DataProvider is missing!");
} // End Function GetFactory
还有一个例子(获取 postgre 工厂):
public System.Data.Common.DbProviderFactory GetFactory()
{
//AddFactoryClasses();
System.Data.Common.DbProviderFactory providerFactory = null;
providerFactory = this.GetFactory(typeof(Npgsql.NpgsqlFactory));
return providerFactory;
} // End Function GetFactory
我在这里猜测,但您是否使用实体框架进行数据访问,并且还想使用成员资格提供程序,并且无法在与实体框架表相同的数据库中获取成员资格模式 - 如果是这样,请尝试以下操作:
让您成为实体框架(或您已经创建的任何其他数据库事物),然后使用 aspnet_regsql.exe 指定您希望在哪个数据库中创建成员资格架构。
该工具可以通过命令行或漂亮的设置向导为您有效地创建表格。
请在此处查看本教程http://www.asp.net/web-forms/tutorials/security/membership/creating-the-membership-schema-in-sql-server-vb特别注意标题为步骤 2:添加的部分SqlMembershipProvider 架构到数据库。
为方便起见,这是从上述文章中粘贴的重要部分:
第 2 步:将 SqlMembershipProvider 架构添加到数据库
SqlMembershipProvider 需要在用户存储数据库中安装一组特定的表、视图和存储过程。可以使用 aspnet_regsql.exe 工具添加这些必需的数据库对象。此文件位于 %WINDIR%\Microsoft.Net\Framework\v2.0.50727\ 文件夹中。
注意:aspnet_regsql.exe 工具提供命令行功能和图形用户界面。图形界面更加用户友好,这也是我们将在本教程中研究的内容。当需要自动添加 SqlMembershipProvider 架构时,命令行界面很有用,例如在构建脚本或自动化测试场景中。
aspnet_regsql.exe 工具用于向指定的 SQL Server 数据库添加或删除 ASP.NET 应用程序服务。ASP.NET 应用程序服务包含 SqlMembershipProvider 和 SqlRoleProvider 的架构,以及其他 ASP.NET 2.0 框架的基于 SQL 的提供程序的架构。我们需要向 aspnet_regsql.exe 工具提供两点信息:
我们是否要添加或删除应用程序服务,以及要从中添加或删除应用程序服务架构的数据库在提示使用数据库时,aspnet_regsql.exe 工具要求我们提供数据库所在服务器的名称,用于连接到数据库的安全凭证和数据库名称。如果您使用的是 SQL Server 的非 Express 版,您应该已经知道此信息,因为它与您在通过 ASP.NET 网页使用数据库时必须通过连接字符串提供的信息相同。但是,在使用 App_Data 文件夹中的 SQL Server 2005 Express Edition 数据库时确定服务器和数据库名称会涉及更多内容。
抱歉,伙计们提出了新问题,感谢所有答案!这对我有用。
首先,让我的 DBContext 数据模型看起来像......
public class CDBContext : DbContext
{
public DbSet<tbl1> tbl1{ get; set; }
public DbSet<tbl2> tbl2{ get; set; }
public DbSet<tbl3> tbl3{ get; set; }
public DbSet<tbl4> tbl4{ get; set; }
}
然后,有一个示例表模型看起来像
public class tbl1
{
public int ID { get; set; }
public string Var2{ get; set; }
public string Var3{ get; set; }
}
接下来,我使用“Add->Controller”向导,选择适当的数据模型(tbl1)和适当的上下文(CDBContext)。然后我可以对模型 tbl2、tbl3 和 tbl4 执行此操作!每个模型都成为数据库中的一个表,而不是为数据库使用整个表(这是我之前所做的)。
现在看来可以用了,再次感谢!