11

我不得不突然转而使用 Code First Entity Framework 4.1。一开始我对这个框架一无所知,但在过去的 8 小时里,我现在阅读博客和文章更加自如了。

这个博客尤其是我迄今为止看到的关于该主题的最好的博客之一,但给出的步骤与我的经验不符。特别是,我需要更多地关注第 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 选项?

4

2 回答 2

27

这是来自 MSDN 的权威指南

如何:从概念模型(实体数据模型工具) [.edmx] 文件生成数据库。

为了完整起见,在此处复制/粘贴:

从概念模型生成数据库

1 - 将 .edmx 文件添加到您的项目中。

有关将 .edmx 文件添加到项目的信息,请参阅如何:创建新的 .edmx 文件(实体数据模型工具)和如何:添加现有的 .edmx 文件(实体数据模型工具)。

2 - 建立概念模型。

您可以使用 ADO.NET 实体数据模型设计器(Entity Designer)来创建实体和关系,也可以手动编辑 .edmx 文件来构建概念模型。有关更多信息,请参阅实现高级实体框架功能和 CSDL、SSDL 和 MSL 规范。

NoteNote 当您构建概念模型时,关于未映射实体和关联的警告可能会出现在错误列表中。您可以忽略这些警告,因为创建数据库向导将添加存储模型和映射信息(参见步骤 3)。

3 - 右键单击​​实体设计器表面上的空白区域,然后选择从模型生成数据库。

将显示生成数据库向导(实体数据模型工具)的选择您的数据连接对话框。

4 - 单击新建连接按钮或从下拉列表中选择现有连接按钮以提供数据库连接。

您必须提供数据库连接,以便可以根据模型中的属性类型确定目标数据库的列类型,以便可以将连接字符串信息添加到您的应用程序中。请注意,提供连接信息不会启动数据定义语言 (DDL) 生成。

5 - 单击下一步。

创建数据库向导生成用于创建数据库的数据定义语言。生成的 DDL 显示在摘要和设置对话框(生成数据库向导)中。

6 - 单击完成。

完成后,创建数据库向导将执行以下操作:

生成与提供的概念架构定义语言 (CSDL) 对应的存储架构定义语言 (SSDL) 和映射规范语言 (MSL)。使用生成的 SSDL 和 MSL 更新 .edmx 文件。请注意,该向导会覆盖现有的 SSDL 和 MSL。

将生成的 DDL 保存在 Save DDL As 文本框中指定的位置。有关生成的 DDL 的更多信息,请参阅数据库生成规则(生成数据库向导)。

NoteNote 如果在运行 Create Database Wizard 时已经定义了存储模型,则生成的 DDL 将包含从存储模型推断的每个 EntitySet 和每个 AssociationSet(分别)的 DROP TABLE 语句和 DROP CONSTRAINT 语句。

将连接字符串信息添加到您的 App.config 或 Web.config 文件。

请务必注意,创建数据库向导不会执行生成的 DDL。要创建与您的概念模型对应的数据库架构,您必须独立执行生成的 DDL(例如,在 SQL Server Management Studio 中执行 DDL)。

于 2014-05-29T20:26:52.897 回答
8

如果从模型创建数据库,则需要先选择空模型。以下是创建数据库的其他步骤:

  1. 选择新连接
  2. 设置服务器名称:如果您安装了它,只需键入 . 选择默认值。你也可以试试(本地)
  3. 设置新的数据库名称
  4. 将 DDL 脚本复制到 SQL 服务器管理工​​作室的查询屏幕
  5. 运行脚本来创建你的数据库

运行脚本后,您将拥有初始表。配置文件将具有命名为容器名称的连接字符串。

现在,当您想切换到类似于带有 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->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();
            }
        }
于 2011-09-26T13:31:56.413 回答