我真正使用的是哪种 Entity Framework 技术?
Which Entity Framework technology am I really using?
这听起来有点傻,但当我想到 "Entity Framework" 时,我不确定我实际使用的是什么。我注意到在搜索文档时,我经常以我根本没有或直接使用的对象和方法(例如 objectcontext、EntityState 等)结束。我也不确定在任何给定时间我使用的是哪个 Linq(Linq2SQL、Linq2Entities、Linq2Objects)。
我认为我正在使用:
数据库优先 ADO.NET 实体数据模型和 Linq to Entities。
我的设置:
Microsoft Visual Studio Professional 2015,使用从官网下载的安装程序默认安装。最新的,没有安装额外的插件、库或包。
我是做什么的:
像这样设计一个数据库并在SQLServer
中创建
MyFooDB
table Foo ( PK int Id, varchar Name)
table Bar ( PK int Id, bit Active, FK int FooId references Foo.Id )
打开 VS2015,文件 > 新建 > 项目 > C# > Windows >控制台应用程序。
- 在解决方案资源管理器中,右键单击项目节点 > 添加 > 新项 > 数据 > ADO.NET 实体数据模型。
- 一个对话框打开,我从数据库中选择 EF 设计器,连接到我的服务器并选择我的数据库 "MyFooDB"。在对话框的底部,它表示设置将在 app.config 中保存为 "MyFooDBEntities"。
- 有人问我要使用哪个版本的Entity Framework,这次我会选择6.X。
- 出现一个对话框供我选择要包含的数据库对象。模型命名空间文本字段显示 "MyFooDBModel"。我检查 "Foo" 和 "Bar" 然后单击完成。
创建并打开了一个 edmx 文件。我看到了我选择的对象的图表。在 edmx 文件下我看到这个结构:
MyFooDBModel.edmx
-MyFooDBModel.Context.tt
-MyFooDBModel.Context.cs
-MyFooDBModel.Designer.cs
-MyFooDBModel.edmx.diagram
-MyFooDBModel.tt
-Foo.cs
-Bar.cs
在 Program.cs 中,我实例化了一个 MyFooDBEntities 并使用它:
var db = new MyFooDBEntities();
var firstFoo = db.Foos.First(x => x.Id == 1);
if (!firstFoo.Bars.Any())
{
Bar b = new Bar() { Id = 3, Active=true };
firstFoo.Bars.Add(b);
db.SaveChanges();
}
所以我的问题是我使用了哪些不同的技术,它们之间有什么关系?
LINQ2SQL
是一种完全不同(且不再受支持)的技术,它曾经有不同的模板,有点像 EF 的 "quicker and simpler" 版本(尽管两者之间没有实际关系两个)。
LINQ2Objects
是对内存中的objects/instances应用LINQ表达式的描述,与EF或L2S并不完全相同。
您确实在使用 Entity Framework 以及实体数据模型 (EDMX)。 EDMX 是旧版本 EF 的遗留物,在旧版本的 EF 中,您有一个设计界面(记得那些很酷的时候)来设计您的数据模型。使用 EF6.x,您仍然可以使用这些,它们基本上用于为您生成 .cs
文件。这不再是大多数人认为使用 EF 的 "Best Practice",现在生成模型的首选方法是使用 Code First 和 POCO。
在幕后,EF 6.x 仍然对 EDMX 范例有很多遗留依赖,因此代码优先和流畅的配置在某种程度上用于构建它,所以我不 think 两者在功能上有明显的区别。但一般来说,代码优先更容易使用、维护,并且让第 3 方更容易理解您的代码。
使用 Entity Framework 核心(以前的 Entity Framework 7),它已被完全重写并且不再支持 EDMX 模型,因此仅出于这个原因您可能会考虑放弃它们(不确定6 和 Core 之间的迁移路径是否或迁移路径是什么)。
这听起来有点傻,但当我想到 "Entity Framework" 时,我不确定我实际使用的是什么。我注意到在搜索文档时,我经常以我根本没有或直接使用的对象和方法(例如 objectcontext、EntityState 等)结束。我也不确定在任何给定时间我使用的是哪个 Linq(Linq2SQL、Linq2Entities、Linq2Objects)。
我认为我正在使用:
数据库优先 ADO.NET 实体数据模型和 Linq to Entities。
我的设置:
Microsoft Visual Studio Professional 2015,使用从官网下载的安装程序默认安装。最新的,没有安装额外的插件、库或包。
我是做什么的:
像这样设计一个数据库并在SQLServer
中创建MyFooDB table Foo ( PK int Id, varchar Name) table Bar ( PK int Id, bit Active, FK int FooId references Foo.Id )
打开 VS2015,文件 > 新建 > 项目 > C# > Windows >控制台应用程序。
- 在解决方案资源管理器中,右键单击项目节点 > 添加 > 新项 > 数据 > ADO.NET 实体数据模型。
- 一个对话框打开,我从数据库中选择 EF 设计器,连接到我的服务器并选择我的数据库 "MyFooDB"。在对话框的底部,它表示设置将在 app.config 中保存为 "MyFooDBEntities"。
- 有人问我要使用哪个版本的Entity Framework,这次我会选择6.X。
- 出现一个对话框供我选择要包含的数据库对象。模型命名空间文本字段显示 "MyFooDBModel"。我检查 "Foo" 和 "Bar" 然后单击完成。
创建并打开了一个 edmx 文件。我看到了我选择的对象的图表。在 edmx 文件下我看到这个结构:
MyFooDBModel.edmx -MyFooDBModel.Context.tt -MyFooDBModel.Context.cs -MyFooDBModel.Designer.cs -MyFooDBModel.edmx.diagram -MyFooDBModel.tt -Foo.cs -Bar.cs
在 Program.cs 中,我实例化了一个 MyFooDBEntities 并使用它:
var db = new MyFooDBEntities(); var firstFoo = db.Foos.First(x => x.Id == 1); if (!firstFoo.Bars.Any()) { Bar b = new Bar() { Id = 3, Active=true }; firstFoo.Bars.Add(b); db.SaveChanges(); }
所以我的问题是我使用了哪些不同的技术,它们之间有什么关系?
LINQ2SQL
是一种完全不同(且不再受支持)的技术,它曾经有不同的模板,有点像 EF 的 "quicker and simpler" 版本(尽管两者之间没有实际关系两个)。
LINQ2Objects
是对内存中的objects/instances应用LINQ表达式的描述,与EF或L2S并不完全相同。
您确实在使用 Entity Framework 以及实体数据模型 (EDMX)。 EDMX 是旧版本 EF 的遗留物,在旧版本的 EF 中,您有一个设计界面(记得那些很酷的时候)来设计您的数据模型。使用 EF6.x,您仍然可以使用这些,它们基本上用于为您生成 .cs
文件。这不再是大多数人认为使用 EF 的 "Best Practice",现在生成模型的首选方法是使用 Code First 和 POCO。
在幕后,EF 6.x 仍然对 EDMX 范例有很多遗留依赖,因此代码优先和流畅的配置在某种程度上用于构建它,所以我不 think 两者在功能上有明显的区别。但一般来说,代码优先更容易使用、维护,并且让第 3 方更容易理解您的代码。
使用 Entity Framework 核心(以前的 Entity Framework 7),它已被完全重写并且不再支持 EDMX 模型,因此仅出于这个原因您可能会考虑放弃它们(不确定6 和 Core 之间的迁移路径是否或迁移路径是什么)。