我知道当我使用ado.net时,我可以在运行时以编程方式创建数据库或表,如:
String str;
SqlConnection myConn = new SqlConnection("Server=localhost;Integrated security=SSPI;database=master");
str = "CREATE DATABASE MyDatabase ON PRIMARY " +
"(NAME = MyDatabase_Data, " +
"FILENAME = 'C:\\MyDatabaseData.mdf', " +
"SIZE = 2MB, MAXSIZE = 10MB, FILEGROWTH = 10%) " +
"LOG ON (NAME = MyDatabase_Log, " +
"FILENAME = 'C:\\MyDatabaseLog.ldf', " +
"SIZE = 1MB, " +
"MAXSIZE = 5MB, " +
"FILEGROWTH = 10%)";
SqlCommand myCommand = new SqlCommand(str, myConn);
try
{
myConn.Open();
myCommand.ExecuteNonQuery();
MessageBox.Show("DataBase is Created Successfully", "MyProgram", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (System.Exception ex)
{
MessageBox.Show(ex.ToString(), "MyProgram", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
finally
{
if (myConn.State == ConnectionState.Open)
{
myConn.Close();
}
}
但我正在使用实体框架,我有一些工作,我必须在运行时创建表。我已经搜索了很多关于它但我没办法。任何帮助将不胜感激。
答案 0 :(得分:6)
实体框架不适用于您没有静态数据库架构的情况。
原因:
dynamic
,因此唯一的方法是使用在创建表格之前创建的新类动态加载程序集或大量使用Reflection.Emit
并让您的程序自行编写&#34} ; 如果你只需要创建一个数据库,但表格总是一样的,你应该没问题。您可以使用该ADO.NET代码创建数据库和表,并仅将已修改的连接字符串传递给上下文的构造函数。但要求是静态数据库模式=表的定义没有变化。
答案 1 :(得分:2)
实体框架也有类似myCommand.ExecuteNonQuery();
的功能,您可以尝试SomeEntities.ExecuteStoreCommand("some sql statements")
。
考虑到实体框架需要数据模型和数据库之间的映射,看起来不可能直接使用集成查询语言创建/修改表(否则需要在运行时修改数据模型)。因此,由于没有支持这种观点的可靠参考,我认为SomeEntities.ExecuteStoreCommand()
可能是唯一的方法。
答案 2 :(得分:1)
请阅读此主题: NHibernate / Fluent NHibernate Dynamic Column Mapping
最好使用像Redis这样的键值存储或像CouchDB这样的无模式数据库而不是SQL