我不得不突然转向使用Code First Entity Framework 4.1。我开始对这个框架一无所知,但在过去的8小时里,我现在对阅读博客和文章感到更舒服。
This blog in particular是迄今为止我就该主题看到的最好的博客之一,但所给出的步骤与我的经验不符。特别是,我需要更多地关注第3和第4步(分别是'创建模型'和'交换到DbContext代码生成')。我无法从我定义的EntitySet生成数据库。我得到SQL,我可以执行,但我收到以下错误:
Could not locate entry in sysdatabases for "MyBD" database . No entry found with that name. Make sure that the name is entered correctly entity framework.
如果我再次执行SQL,则会在数据库中已存在的表名后面出现相同的错误。
如果在服务器资源管理器中刷新DataConnection,则不会创建我在实体框架中定义的表。
如何摆脱此错误并在我的.edmx中成功生成表格?
此外,我无法在解决方案资源管理器中右键单击选定类文件中的“生成数据库”,该文件具有从DBContext对象继承的上下文类。我从Microsoft安装了Entity framework 4.1,因此它应该出现在那里......我如何获得Generate Database选项?
答案 0 :(得分:22)
以下是MSDN上的权威指南
How to: Generate a Database from a Conceptual Model (Entity Data Model Tools) [.edmx]档案。
复制/粘贴只是为了完整起见:
从概念模型生成数据库
1 - 将.edmx文件添加到项目中。
有关将.edmx文件添加到项目的信息,请参阅如何: 创建一个新的.edmx文件(实体数据模型工具)和如何:添加一个 现有的.edmx文件(实体数据模型工具)。
2 - 构建概念模型。
您可以使用ADO.NET实体数据模型设计器(实体设计器) 创建实体和关系,或者您可以手动编辑 .edmx文件构建概念模型。有关更多信息,请参阅 实现高级实体框架功能和CSDL,SSDL和 MSL规范。
注意注意在构建概念模型时,有关未映射的警告 实体和关联可能出现在错误列表中。你可以忽略 这些警告,因为创建数据库向导将添加存储 模型和映射信息(见步骤3)。
3 - 右键单击实体设计器表面上的空白区域,然后选择 从模型生成数据库。
生成数据库的“选择数据连接”对话框 显示向导(实体数据模型工具)。
4 - 单击“新建连接”按钮或选择现有连接 从下拉列表中提供按钮以提供数据库连接。
您必须提供数据库连接,以便列的类型为 目标数据库可以根据您的属性类型确定 模型,以便连接字符串信息可以添加到您的 应用。请注意,提供连接信息不会 启动数据定义语言(DDL)生成。
5 - 单击“下一步”。
“创建数据库向导”为其生成数据定义语言 创建数据库。生成的DDL显示在摘要和 设置对话框(生成数据库向导)。
6 - 点击完成。
完成后,“创建数据库向导”将执行以下操作:
生成商店架构定义语言(SSDL)和映射 与提供的对应的规范语言(MSL) 概念架构定义语言(CSDL)。 .edmx文件是 使用生成的SSDL和MSL进行更新。请注意该向导 覆盖现有的SSDL和MSL。
将生成的DDL保存在“保存DDL为”中指定的位置 文本框。有关生成的DDL的详细信息,请参阅数据库 生成规则(生成数据库向导)。
注意注意如果在运行“创建”时已定义存储模型 数据库向导,生成的DDL将包含DROP TABLE语句 和每个EntitySet的DROP CONSTRAINT语句 从存储推断出的AssociationSet(分别) 模型。
将连接字符串信息添加到App.config或Web.config 文件。
请务必注意,“创建数据库向导”不会 执行生成的DDL。创建数据库模式 对应于您的概念模型,您必须执行生成的 DDL独立(例如,在SQL Server中执行DDL) 管理工作室)。
答案 1 :(得分:6)
如果要从模型创建数据库,则需要先选择空模型。以下是创建db的其他步骤:
运行脚本后,您将拥有初始表。配置文件将具有名为容器名称的连接字符串。
现在,当您想切换到与TT文件类似的代码生成时,您可以右键单击并添加代码生成。它将为实体模型创建部分类,为dbcontext创建一个文件。与此类似:
using System;
using System.Collections.Generic;
public partial class Contact
{
public int Id { get; set; }
public string Name { get; set; }
}
上下文只有一个表。
public partial class PersonModelContainer : DbContext
{
public PersonModelContainer()
: base("name=PersonModelContainer")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}
public DbSet<Contact> Contacts { get; set; }
}
你不需要TT模型。您可以直接添加这些文件。您需要一个继承自DbContext的上下文类和一个用于每种类型实体的部分类文件。如果您对模型进行更改,EF将检测到该模型。您需要定义Db初始化程序。对于该网页上的示例演示,您可以将初始化程序添加到另一个方法。如果它是一个Web项目,则将此init函数添加到Global.asax-&gt; application_Start以进行初始开发。初始化程序有不同的选项。我使用drop和create进行初始开发。
static void InitDbCheck()
{
Database.SetInitializer(new DropCreateDatabaseIfModelChanges<PersonModelContainer>());
using (var db = new PersonModelContainer())
{
//accessing a record will trigger to check db.
int recordCount = db.Contacts.Count();
}
}
static void Main(string[] args)
{
using (var db = new PersonModelContainer())
{
// Save some data
db.Contacts.Add(new Contact { Name = "Bob" });
db.Contacts.Add(new Contact { Name = "Ted" });
db.Contacts.Add(new Contact { Name = "Jane" });
db.SaveChanges();
// Use LINQ to access data
var people = from p in db.Contacts
orderby p.Name
select p;
Console.WriteLine("All People:");
foreach (var person in people)
{
Console.WriteLine("- {0}", person.Name);
}
// Change someones name
db.Contacts.First().Name = "Janet";
db.SaveChanges();
}
}