在实体框架中,我们可以使用3种方法模型优先,代码优先,数据库优先但是每种方法都需要手动手动触摸(意味着创建数据库或创建模型或在继续下一步之前(在上下文中使用EF)编写POCO类代码或实体类代码)。
如果我想以编程方式创建数据库以及表和表关系,并且仍希望获得EntityFramework 4.3的功能,那该怎么办。
更具体地说,从这个示例http://support.microsoft.com/kb/307283我们可以使用SQL命令创建数据库,表和所有内容,但我们不能拥有实体框架的优点。所以,如果我们想要我们应该做什么呢?
为了能够创建动态表字段,这些步骤是不够的。在所有3个步骤的数据库中,表和表列都是固定的。用户无法动态创建新表或列。这篇文章中的http://support.microsoft.com/kb/307283,它展示了如何使用SQL创建手动数据库,表等,但它基于ADO.NET,但我希望实体管理器能够做到这一点。它不会是一种魔力,当然,应该有编程方案(我想知道编程方法)。
答案 0 :(得分:2)
我相信您希望能够使用SQL命令创建数据库和数据库对象。然后使用EntityFramework上下文映射这些对象。根据您的项目,您可以从DBContext派生多个上下文,每个上下文都执行一些特定的角色。
如果是这样,DbContext中有Database类,它具有执行SQL的功能。在上下文对象上简单地调用这些函数。
MyContext db = new MyContext()
//Where MyContext :DbContext (MyContext derives from DbContext)
db.Database.ExecuteSqlCommand(sqlcommand, params);
//There are other method in this class like SqlQuery Read documentation.
//The SqlQury is also available on the entities like db.MyEntitySet.SqlQuery(...)
如果您希望EF代码与现有数据库一起使用,那么您可以关注this blog
如果您希望上下文使用数据库名称,则可以在构造函数中传递它,如下所示。您可以尝试在现有数据库中使用此类上下文。
public class MyContext : DbContext
{
public MyContext():base("MyDatabase")
{
}
.....
}
答案 1 :(得分:0)
如果使用EF的Code First方法,则DatabaseInitializer默认策略为“如果不存在则创建数据库”。因此,基于连接字符串,DbContext将检查数据库是否存在。如果没有找到,EF将首次运行必要的脚本为您创建数据库,表和关系。要运行的脚本将根据您的模型生成(POCO类和映射配置/数据注释)。
想象一下,您想要创建2个表:客户和订单。
public class Customer
{
public int Id { get;set; }
public string Name { get;set; }
public ICollection<Order> Orders { get; set; }
}
public class Order
{
public int Id { get; set; }
public int CustomerId { get; set; }
public virtual Customer Customer { get; set; }
/* ... more fields*/
}
public class MyContext: DbContext
{
public DbSet<Order> Orders { get; set; }
public DbSet<Customer> Customers { get; set; }
public MyContext(): base("MyConnectionString")
{
}
}
实例化MyContext类时将创建表,字段和外键约束:
using (var ctx = new MyContext())
{
/**/
}
答案 2 :(得分:0)
我第二次回答Abhijit的回答。我假设你已经准备好了你的SQL系列(表格,SProcs等)。
现在要创建编写EF查询,您只需要访问EF中的dbcontext类。正如我们在LINQ中所做的那样。
以下是MSDN mag中的一篇很好的文章:http://msdn.microsoft.com/en-us/magazine/gg232765.aspx
希望它有所帮助!