如何从Entity Framework中的.edmx文件生成数据库?

时间:2011-09-26 12:55:18

标签: c# database entity-framework edmx auto-generate

我不得不突然转向使用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选项?

2 个答案:

答案 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的其他步骤:

  1. 选择新连接
  2. 设置服务器名称:如果安装了它,只需输入。选择默认值。您也可以尝试(本地)
  3. 设置新数据库名称
  4. 将DDL脚本复制到SQL Server管理工作室的查询屏幕
  5. 运行脚本以创建数据库
  6. 运行脚本后,您将拥有初始表。配置文件将具有名为容器名称的连接字符串。

    现在,当您想切换到与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();
                }
            }