实体框架核心(EF Core)是Entity Framework的一个轻量级,可扩展和跨平台版本。 10月25日,Entity Framework Core 1.1 Preview 1发布了。数据库
若是您使用由EF团队(SQL Server,SQLite和InMemory)提供的数据库提供程序之一,则只需升级提供程序包。json
PM> Update-Package Microsoft.EntityFrameworkCore.SqlServer –Pre
若是您使用的是第三方数据库提供程序,请检查它们是否已发布依赖于1.1.0-preview1-final的更新。 若是他们有,那么只是升级到新版本。 若是没有,那么你应该只能升级它们依赖的EF Core关系组件。 1.1中的大部分新功能不须要更改数据库提供程序。 EF开发组作了一些测试,以确保依赖于1.0的数据库提供程序继续使用1.1预览1,但这个测试还不详尽。
PM> Update-Package Microsoft.EntityFrameworkCore.Relational –Pre
若是你使用的工具包,那么必定要升级。 请注意,工具版本化为1.0.0-preview3-final,由于工具还没有达到其初始稳定版本(在.NET Core,ASP.NET Core和EF Core上的工具都是如此)。app
PM> Update-Package Microsoft.EntityFrameworkCore.Tools –Pre
若是您使用的是ASP.NET Core,那么您须要更新project.json的tools部分以使用新的Microsoft.EntityFrameworkCore.Tools.DotNet包。 随着.NET CLI工具的设计的进行,咱们必须将dotnet ef工具分离到这个单独的包中。
"tools": { "Microsoft.EntityFrameworkCore.Tools.DotNet": "1.0.0-preview3-final" },
1.1版本专一于解决阻止人们采用EF Core的问题。 这包括修复错误并添加一些还没有在EF Core中实现的关键功能。 虽然EF开发组在这方面取得了一些良好的进展,可是,EF Core仍然不会是每一个人的正确选择。 有关实现的更多详细信息,请参阅下面的EF Core和EF6.x比较。框架
有两个版本的Entity Framework,Entity Framework Core和Entity Framework 6.x.ide
Entity Framework 6.x(EF6.x)是一种通过试验和测试的数据访问技术,具备多年的功能和稳定性。 它首次在2008年发布,做为.NET Framework 3.5 SP1和Visual Studio 2008 SP1的一部分。 从EF4.1版本开始,它做为EntityFramework NuGet包发运 - 目前是NuGet.org上最受欢迎的包。工具
EF6.x继续是一个受支持的产品,并将继续进行错误修复和小的改进。测试
实体框架核心(EF Core)是Entity Framework的一个轻量级,可扩展和跨平台版本。 与EF6.x相比,EF Core引入了许多改进和新功能。 同时,EF Core 是一个新的代码基础优化
EF Core保留了来自EF6.x的开发者体验,大多数顶级API也保持不变,所以EF Core对使用EF6.x的用户会感到很是熟悉。 同时,EF Core构建了一套全新的核心组件。 这意味着EF Core不会自动继承EF6.x的全部功能。 其中一些功能将在将来版本中显示(例如延迟加载和链接弹性),其余较不经常使用的功能将不会在EF Core中实现。ui
新的,可扩展的和轻量级核心还容许咱们在EF核心中添加一些在EF6.x中不能实现的特性(例如在LINQ查询中的备用密钥和混合客户端/数据库评估)。spa
在1.1版本中,EF研发团队在改进EF Core LINQ提供程序方面取得了良好的进展。 这使得更多的查询可以成功执行,在数据库(而不是内存)中评估更多的逻辑。
DbSet.Find(...)是一个存在于EF6.x中的API,而且是EF Core的更常见的请求之一。 它容许您根据主键值轻松查询实体。 若是实体已经加载到上下文中,则返回它而不查询数据库。
using (var db = new BloggingContext()) { var blog = db.Blogs.Find(1); }
API中的新的HasField(...)方法容许您为属性配置备用字段。 这是最多见的作法是当一个属性没有setter。
public class BloggingContext : DbContext { ... protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Blog>() .Property(b => b.Url) .HasField("_theUrl"); } }
默认状况下,EF将在查询期间构造实体的实例时使用该字段,或者当它没法使用该属性时(即,它须要设置值,但没有属性设置器)。 您能够经过新的UsePropertyAccessMode(...)API更改。
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Blog>() .Property(b => b.Url) .HasField("_theUrl") .UsePropertyAccessMode(PropertyAccessMode.Field); }
您还能够在模型中建立在实体类中没有相应属性的属性,但使用字段将数据存储在实体中。 这与“阴影属性”(下面介绍,距离此处12cm)不一样,数据存储在更改跟踪器中。 若是实体类使用方法来获取/设置值,则一般使用此方法。
您能够在属性(...)API中给EF字段的名称。 若是没有具备给定名称的属性,则EF将寻找一个字段。
public class BloggingContext : DbContext { ... protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Blog>() .Property("_theUrl"); } }
您还能够选择为该属性指定名称,而不是字段名称。 而后在建立模型时使用此名称,最明显的是它将用于映射到数据库中的列名称。
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Blog>() .Property<string>("Url") .HasField("_theUrl"); }
您可使用EF.Property(...)方法在LINQ查询中引用这些属性。
var blogs = db.Blogs .OrderBy(b => EF.Property<string>(b, "Url")) .ToList();
阴影属性是实体类中不存在的属性。 这些属性的值和状态彻底保留在更改跟踪器中
能够经过ChangeTracker API获取和更改阴影属性值。
context.Entry(myBlog).Property("LastUpdated").CurrentValue = DateTime.Now;
阴影属性能够经过EF.Property静态方法在LINQ查询中引用。
var blogs = context.Blogs .OrderBy(b => EF.Property<DateTime>(b, "LastUpdated"));
按照惯例,仅当发现关系时才建立阴影属性,但在从属实体类中找不到外键属性。 在这种状况下,将引入影子外键属性。 shadow外键属性将命名为<navigation property name><principal key property name>(在依赖实体上的导航,它指向主体实体,用于命名)。 若是主键属性名称包含导航属性的名称,则名称将只是<principal key property name>。 若是从属实体上没有导航属性,则在其位置使用主类型名称。
例如,如下代码清单将致使向Post实体引入BlogId shadow属性。
class MyContext : DbContext { public DbSet<Blog> Blogs { get; set; } public DbSet<Post> Posts { get; set; } } public class Blog { public int BlogId { get; set; } public string Url { get; set; } public List<Post> Posts { get; set; } } public class Post { public int PostId { get; set; } public string Title { get; set; } public string Content { get; set; } public Blog Blog { get; set; } }
没法使用数据注释建立阴影属性。
您可使用Fluent API配置阴影属性。 一旦你调用了Property的字符串重载,你就能够连接任何对其余属性的配置调用。
若是提供给Property方法的名称与现有属性(阴影属性或实体类上定义的属性)的名称匹配,则代码将配置现有属性,而不是引入新的shadow属性。
class MyContext : DbContext { public DbSet<Blog> Blogs { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Blog>() .Property<DateTime>("LastUpdated"); } } public class Blog { public int BlogId { get; set; } public string Url { get; set; } }
阴影属性介绍完毕!
显式加载容许您加载由上下文跟踪的实体的导航属性的内容。
using (var db = new BloggingContext()) { var blog = db.Blogs.Find(1); db.Entry(blog).Collection(b => b.Posts).Load(); db.Entry(blog).Reference(b => b.Author).Load(); }
EF研发团队添加了EF6.x中提供的其他EntityEntry API。 这包括Reload(),GetModifiedProperties(),GetDatabaseValues()等。这些API最经常使用的是经过调用DbContext.Entry(对象实体)方法。
链接弹性自动重试失败的数据库命令。 此版本包括专为SQL Server(包括SQL Azure)定制的执行策略。 此执行策略包含在咱们的SQL Server提供程序中。 它知道能够重试的异常类型,而且具备明显的默认值,用于最大重试次数,重试之间的延迟等。
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer( "<connection string>", options => options.EnableRetryOnFailure()); }
其余数据库提供者能够选择添加为其数据库定制的重试策略。 还有一种机制来注册本身的自定义执行策略。
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseMyProvider( "<connection string>", options => options.ExecutionStrategy(...)); }
内存优化表是SQL Server的一项功能。 您如今能够指定实体映射到的表是内存优化的。 当使用EF Core基于您的模型(使用迁移或Database.EnsureCreated)建立和维护数据库时,将为这些实体建立一个内存优化表。
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Blog>() .ForSqlServerIsMemoryOptimized(); }
在EF Core 1.0中,能够替换EF使用的内部服务,但这是复杂的,须要您控制EF使用的依赖注入容器。 在1.1中,咱们使用了一个ReplaceService(...)方法,能够在配置上下文时使用它。
public class BloggingContext : DbContext { ... protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { ... optionsBuilder.ReplaceService<SqlServerTypeMapper, MyCustomSqlServerTypeMapper>(); } }
稳定的1.1版本将于今年晚些时候推出。 EF研发团队不计划在preview1和稳定版本之间添加任何新功能。 将只是努力修复报告的错误。
EF研发团队如今将注意力转移到EF Core 1.2和EF6.2版本。 将在不久的未来分享这些版本的详细信息。
贴一张Rowan Miller的帅照。Microsoft员工,EF研发团队成员,他的我的Blog:https://romiller.com/,有兴趣的朋友能够去看看。
最后,但愿本文对你有所帮助。
转载请注明出处,转载请注明出处,转载请注明出处,重要的事情说三遍:http://www.cnblogs.com/smallprogram/