【问题标题】:How can I generate the database from .edmx file in Entity Framework?如何从实体框架中的 .edmx 文件生成数据库?
【发布时间】:2011-11-25 04:54:47
【问题描述】:

我不得不突然转而使用 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,则没有我在 Entity Framework 中定义的那样创建表。

我怎样才能摆脱这个错误并在我的 .edmx 中成功生成表格?

我也无法在解决方案资源管理器中右键单击以从选定的类文件中找到“生成数据库”的选项,该类文件具有从 DBContext 对象继承的上下文类。我从 Microsoft 安装了 Entity framework 4.1,所以它应该出现在那里...如何获得 Generate Database 选项?

【问题讨论】:

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


    【解决方案1】:

    这是来自 MSDN 的权威指南

    How to: Generate a Database from a Conceptual Model (Entity Data Model Tools) [.edmx] 文件。

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

    从概念模型生成数据库

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

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

    2 - 构建概念模型。

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

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

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

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

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

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

    5 - 点击下一步。

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

    6 - 点击完成。

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

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

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

    NoteNote 如果在运行 Create 时已经定义了存储模型 数据库向导,生成的 DDL 将包含 DROP TABLE 语句 和每个 EntitySet 的 DROP CONSTRAINT 语句和每个 从存储中推断出的 AssociationSet(分别) 型号。

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

    请务必注意,创建数据库向导不会 执行生成的 DDL。创建数据库模式 对应你的概念模型,你必须执行生成的 独立 DDL(例如在 SQL Server 中执行 DDL 管理工作室)。

    【讨论】:

    • 这不会创建存储过程。有什么方法可以恢复存储过程吗?
    【解决方案2】:

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

    1. 选择新连接
    2. 设置服务器名称:如果已安装,只需键入 .选择默认值。你也可以试试(本地)
    3. 设置新的数据库名称
    4. 将 DDL 脚本复制到 SQL Server Management Studio 的查询屏幕
    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();
                }
            }
    

    【讨论】:

      猜你喜欢
      • 2016-05-13
      • 2023-04-04
      • 1970-01-01
      • 2023-03-18
      • 2010-09-15
      • 1970-01-01
      • 1970-01-01
      • 2011-07-10
      • 1970-01-01
      相关资源
      最近更新 更多