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

Red*_*wan 7 c# database entity-framework auto-generate edmx

我不得不突然转向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.
Run Code Online (Sandbox Code Playgroud)

如果我再次执行SQL,我会在数据库中已存在的表名后面得到相同的错误.

如果在服务器资源管理器中刷新DataConnection,则不会创建我在Entity Framework中定义的表.

如何摆脱此错误并在我的.edmx中成功生成表格?

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

Len*_*rri 23

这是MSDN上的权威指南

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

复制/粘贴只是为了完整起见:

从概念模型生成数据库

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

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

2 - 构建概念模型.

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

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

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

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

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

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

5 - 单击"下一步".

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

6 - 单击"完成".

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

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

将生成的DDL保存在"将DDL另存为"文本框中指定的位置.有关生成的DDL的详细信息,请参阅数据库生成规则(生成数据库向导).

注意注意如果在运行"创建数据库向导"时已定义存储模型,则生成的DDL将包含从存储模型推断的每个EntitySet和每个AssociationSet(分别)的DROP TABLE语句和DROP CONSTRAINT语句.

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

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


Ome*_*glu 6

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

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

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

现在,当您想切换到与TT文件类似的代码生成时,您可以右键单击并添加代码生成.它将为实体模型创建部分类,为dbcontext创建一个文件.与此类似:

 using System;
    using System.Collections.Generic;

    public partial class Contact
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

上下文只有一个表.

 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; }
    }
Run Code Online (Sandbox Code Playgroud)

你不需要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();
            }
        }
Run Code Online (Sandbox Code Playgroud)