我真的使用哪种实体框架技术?

时间:2016-03-16 16:57:32

标签: c# entity-framework linq-to-entities

这听起来有点傻但我不确定当我想到“实体框架”时我实际使用的是什么。我注意到在搜索文档时,我经常会得到我根本没有或直接使用的对象和方法(例如objectcontext,EntityState,ect)。我也不确定我在任何给定时间使用的Linq(Linq2SQL,Linq2Entities,Linq2Objects)。

我认为我正在使用:
数据库优先的ADO.NET实体数据模型和Linq to Entities。

我的设置:
Microsoft Visual Studio Professional 2015,使用从官方网站下载的安装程序以默认设置安装。最新的,没有额外的插件,库或打包安装。

我做了什么:

  • 设计这样的数据库并在SQL Server中创建

     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 designer,连接到我的服务器并选择我的数据库“MyFooDB”。在对话框的底部,它表示该设置将作为“MyFooDBEntities”保存在app.config中。
  • 我被问到我想使用哪个版本的Entity Framework,这次我会选择6.X。
  • 我将出现一个对话框,供我选择要包含的数据库对象。模型命名空间文本字段显示“MyFooDBModel”。我检查“Foo”和“Bar”然后单击Finish。
  • 创建并打开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();
    }
    

所以我的问题是我使用的不同技术是什么以及它们如何相互关联?

1 个答案:

答案 0 :(得分:2)

LINQ2SQL是一种完全不同(并且不再受支持)的技术,它过去常常使用不同的模板,而且更快更简单。 EF版本(虽然两者之间没有实际关系)。

LINQ2Objects是将LINQ表达式应用于内存中的对象/实例的描述,与EF或L2S实际上并不相同。

您确实在使用Entity Framework以及实体数据模型(EDMX)。 EDMX是旧版本EF的结转,你有一个设计表面(记得很酷的时候)来设计你的数据模型。使用EF6.x,您仍然可以使用它们,它们主要用于为您生成.cs个文件。这已不再是大多数人认为的最佳实践"对于使用EF,现在生成模型的首选方法是使用Code First和POCO。

在幕后,EF 6.x仍然具有很多遗留在EDMX范例上的依赖性,所以代码首先和流畅的配置用于在某种程度上构建它,所以我不想想两者之间存在任何重大的功能差异。但一般来说,代码首先更容易使用,维护,并让第三方理解您的代码。

使用Entity Framework Core(以前称为Entity Framework 7),它已被完全重写,并且不再支持EDMX模型,因此仅凭此原因您可能会考虑放弃它们(不确定是否或者是什么迁移路径介于6和Core之间。