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).
如果要从模型创建数据库,则需要先选择空模型.以下是创建db的其他步骤:
运行脚本后,您将拥有初始表.配置文件将具有名为容器名称的连接字符串.
现在,当您想切换到与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)
| 归档时间: |
|
| 查看次数: |
33422 次 |
| 最近记录: |