Entityentity framework 7.07有哪些不同

EF7不是在EF6上更新,而是完全重写了。它完全支持.NET Core runtime,也就是说以后你可以在Mac或者是Linux机器上使用EF了。
& 我还在调研使用哪个ORM或者Micro ORM。Massive或者Dapper都不太适合,因为他们都依赖于System.Data,所以跨平台是个问题。
目前准备先使用EF作为一个实现,底层是一个很高的抽象接口,以后如果有合适的轻量级ORM,可以再替换。
回到正题,EF7比较大的变化:
a.只支持Code-First或者Code,不再支持图形界面的生成。
b.支持关系型数据库。
c.跨平台。
1.开始安装EF7的包。
按照之前两篇文章介绍的,使用kpm来安装ef7使用Sql Server作为存储的实现(你可以在*inux平台使用EntityFramework.InMemery去存储数据)。
安装完成后,可以看到project.json已经改变。
为了更方便的使用EF,EF团队给我们开发了一个命令包,你可以安装这个命令包来轻松创建数据访问的代码。下面的命令来安装mands
2.使用命令来生成代码。
这块儿算是比较酷的,相对于之前版本的.NET,这一点儿算是很好的学习别的语言亮点。
下面我们需要编辑一下project.json来添加一个命令,用来通过ef生成代码。
和k web类似,我们可以通过 k ef来创建DbContent文件和对应的SQL语句。
不过先通过 k ef来看一个神奇的事情:
可以看到k ef对应的有三个子命令,context和migration以及帮助命令。
context命令是无法创建DbContext的,所以需要手动创建一个DbContext,MyDbContext.cs文件。
接下是执行migration命令,使用migration来生成code-first的代码。
执行k ef migration add &initial&命令。
查看代码文件件,可以看到新生成了如下文件:
最后我们需要通过apply子命令,来生成数据库中对应的表:
执行:k ef migration apply
数据库中对应的表自动创建成功:
接下来就可以使用EF进行数据访问了。
3.EF集成到Dependency Injection。。
下面需要做的就是把EF相关的内容注入到.NET5的默认容器中,以方便构造函数注入。
修改project.json如下:
4.修改Controller和添加Views文件夹。
接下来就可以修改Controller和添加Views了。
HomeController文件:
对应的View文件:
最后使用K web运行应用程序:
因为表中没有数据,所以count为0。致此就完成了EF的使用初级教程。
十分钟轻松让你认识Entity Framework 7
的一个改动是Controller不再需要继承那个名字是Controller的基类,但是实际中你可能习惯了继承它,所以这个习惯是可以保持的。MVC框架会自动的搜索*Controller的类,并认为它就是一个
大胆地全OO式地进行。数据作为贯穿项目整体的一方面,已EF为基础,自然占了很重一部分,所以从EF进行扩展也是不错的选择。  第一部分Basic会简单地带过一些我对EF相关基础的&认识,认识
;而EntityFramework支持的特性比较多,所以相对比较复杂。模型:LINQtoSQL在数据表与类之间提供了一对一的映射。如果你有Customers,Orders,和Lineitems表,你就会有Customer,Order
(db.KeyValueTbl.First().Value);}Console.ReadKey(true);}}不出意外,你应该可以看到数据,并且可以用其它工具打开数据库,你会发现表已自动创建并且有一条数据。当然了,现在的驱动也同时支持
声明这里有此东西是参考各大神修改和补充而来,有些地方就找不到原文章的地址了,一参考地址如下:寄语本着取之于大神,还之于大众的精神,我把本人整理以及扩展的一些重要部分贴出来,希望你也积极把你觉得好
4.0也可以支持大名鼎鼎的MySql,这篇POST将向展示如何实现EF+MySql数据库的结构.首先,你必须下载,也就是.net下连接MySql数据库的驱动程序.还是像以往一样的,增加一个
Add1#region1.0新增+voidAdd()2///&summary&3///新增4///&/summary&5staticvoidAdd()6{7//1.创建实体
}FirstName:{2}"+72"SecondName:{3}Age:{4}\nAddress:{5}Telephone:{6}EMail:{7}\n",73message,person.Id
正则表达式在线测试工具
FaceYe @ 2015 &&&&
ICP备案号:粤ICP备1500070EntityFramework 7 Left Join Where is error(Test re - 为程序员服务
EntityFramework 7 Left Join Where is error(Test re
First of all, my English is very poor, so I may not be a very good expression, very sorry!
In this blog: , Were left join query using Linq, I probably had four different grammar test, but I tested may be some messy, so it would be more difficult to analyze, and here I only tested a grammar, this is my project is used to test the following elements:
BloggingContext configuration code:
using Microsoft.Data.E
using Microsoft.Data.Entity.M
using System.Collections.G
namespace EF7
public class BloggingContext : DbContext
public DbSet&Blog& Blogs { }
public DbSet&BlogCate& BlogCates { }
protected override void OnConfiguring(DbContextOptions builder)
builder.UseSqlServer(@&Server=.;Database=BTrusted_Connection=T&);
protected override void OnModelCreating(ModelBuilder builder)
builder.Entity&Blog&()
.Key(b =& b.BlogId);
builder.Entity&BlogCate&()
.Key(b =& b.CateId);
public class Blog
public int BlogId { }
public string Url { }
public int BlogCateId { }
public class BlogCate
public int CateId { }
public string CateName { }
Note that in OnModelCreating, I did not make for BlogCate OneToMany configuration and Blog, that they do not exist ForeignKey relationship, so I did not use Include grammar.
Test code(The most important):
public void TestWithLeftJoin()
using (var context = new BloggingContext())
var query = from b in context.Blogs
join c in context.BlogCates on b.BlogCateId equals c.CateId into left
from c in left.DefaultIfEmpty()
where b.Url == &/&
select new { b.BlogId, c.CateName };
var result = query.ToList();
EF6 Test Results:
SQL Server Profiler to get SQL code:
[Extent1].[BlogId] AS [BlogId],
[Extent2].[CateName] AS [CateName]
[dbo].[Blog] AS [Extent1]
LEFT OUTER JOIN [dbo].[BlogCate] AS [Extent2] ON [Extent1].[BlogCateId] = [Extent2].[CateId]
WHERE N'/' = [Extent1].[Url]
EF7 Test Results:
Error details:
The multi-part identifier &b.Url& could not be bound. at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action1 wrapCloseInAction) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) at System.Data.SqlClient.SqlDataReader.TryConsumeMetaData() at System.Data.SqlClient.SqlDataReader.get_MetaData() at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds) at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource1 completion, Int32 timeout, Task& task, Boolean asyncWrite) at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) at mon.DbCommand.ExecuteReader() at Microsoft.Data.Entity.Relational.Query.QueryingEnumerable1.Enumerator.MoveNext() at System.Linq.Lookup2.CreateForJoin(IEnumerable1 source, Func2 keySelector, IEqualityComparer1 comparer) at System.Linq.Enumerable.d__6a4.MoveNext() at System.Linq.Enumerable.d__142.MoveNext() at System.Linq.Enumerable.WhereSelectEnumerableIterator2.MoveNext() at Microsoft.Data.Entity.Query.EntityQueryExecutor.EnumerableExceptionInterceptor1.EnumeratorExceptionInterceptor.MoveNext() at System.Collections.Generic.List1..ctor(IEnumerable1 collection) at System.Linq.Enumerable.ToList [TSource] (IEnumerable1 source) at EF7.Tests.EF7_Test.TestWithLeftJoin() in C:\Users\yuezhongxin\Desktop\EF7\src\EF7.Tests\EF7_Test.cs:line 47
Use EF6 generated SQL code is what I want, but it is wrong to use EF7. From the test code you can see that I am asking for Url for && The BlogId and CateName information, in Blog, BlogCateId value may be Null, so just use the Left Join, rather Inner Join. The above test code is just an example, but my project is the same, I do not know if you can understand what I mean?
Also, if I put Where conditions are removed, use EF7 is right, like this:
However, using SQL Server Profiler to get SQL code is so that:
In EF7, I personally feel that there are some problems using the Join, like this same problem:
I feel they are essentially a problem.
I’m sorry I can only use these English expressions, thanks!
又一个码农站点
原文地址:, 感谢原作者分享。
您可能感兴趣的代码使用 Entity Framework 7 进行 SQLite 的 CURD 操作 - 技术翻译 - 开源中国社区
当前访客身份:游客 [
已有文章 2363 篇
当前位置:
使用 Entity Framework 7 进行 SQLite 的 CURD 操作
英文原文:
0人收藏此文章,
推荐于 8个月前 (共 7 段, 翻译完成于 02-22) ()
参与翻译(1人):
我善于使用传统的SQL查询风格,从SQL查询解析和转换出无类型的结果,EF给表的操作带来更多的舒适性和生产力:操作的是强类型对象&(比如 Employee, Student, 等等,而不是 row["FirstName"], Int32.Parse(reader["Id"].ToString()), 等等这些东西。), 代码会通过Visual Studio给出错误提示,而且是编译时的,而不是运行时的。你也许想看看我是如何将&&的。
在读过&以及&之后,我已经决定尝试自己写写代码。本文就是我的一些心得。
有&, 注入建模和移植方面。不过并不是大问题 &(见上手提示部分)。
你所需要的就是通过NuGet来安装&EntityFramework.SQLite&。包中已经包含了 SQLite 引擎(x86 和 x64 机器的都有)。然后加入代码 using Microsoft.Data.E&以及 using Microsoft.Data.S, 这样我们就准备好了。
&翻译的不错哦!
项目是关于数字媒体商店的。首先来看看&&数据库的定义概要图:
我们对数据库进行了”逆向工程“。目前,我们值关注下面这些表 :Artist,&Album,&Track,&Playlist,&MediaType, 以及&Genre。&注意&PlaylistTrack&(有一个组合键) 只是用来为两个表 (Playlist 和 Track) 建立多对多关联的。一个艺术家(artist)拥有许多的专辑(album),而一个专辑拥有许多的音乐作品(track),音乐作品则必须是诸多媒体类型的其中 之一,还有就是风格(genre)也会有许多的音乐作品。最后,一个播放列表(playlist)可以包含许多的音乐作品,并且如我们之前提到过的,一个音乐作品也可以出现在许多个播放列表上。
开始创建一个新的控制台工程,叫做ChinookMediaStore。搜索 NuGet 包,关键词是 'Entity Framework SQLite', 将 'Include prerelease' (包含之前的版本)复选框选上, 然后安装这个包,如下:
此时(日)用于SQLite的EF7的最新版本是&EntityFramework.SQLite 7.0.0-beta8.
&翻译的不错哦!
基于对上述概要图的观察,下面是我们的实体:
#region&Models
&&&&public&class&Artist
&&&&&&&&public&int&ArtistId&{&&&}
&&&&&&&&public&string&Name&{&&&}
&&&&&&&&public&virtual&ICollection&album&&Albums&{&&&}
&&&&&&&&&&&&=&new&HashSet&album&();
&&&&public&class&Album
&&&&&&&&public&int&AlbumId&{&&&}
&&&&&&&&public&string&Title&{&&&}
&&&&&&&&public&int&ArtistId&{&&&}
&&&&&&&&public&virtual&Artist&Artist&{&&&}
&&&&&&&&public&virtual&ICollection&track&/&&Tracks&{&&&}
&&&&&&&&&&&&=&new&HashSet&track&/&();
&&&&public&class&MediaType
&&&&&&&&public&int&MediaTypeId&{&&&}
&&&&&&&&public&string&Name&{&&&}
&&&&&&&&public&virtual&ICollection&track&/&&Tracks&{&&&}
&&&&&&&&&&&&=&new&HashSet&track&/&();
&&&&public&class&Genre
&&&&&&&&public&int&GenreId&{&&&}
&&&&&&&&public&string&Name&{&&&}
&&&&&&&&public&virtual&ICollection&track&/&&Tracks&{&&&}
&&&&&&&&&&&&=&new&HashSet&track&/&();
&&&&public&class&Track
&&&&&&&&public&int&TrackId&{&&&}
&&&&&&&&public&string&Name&{&&&}
&&&&&&&&public&double&UnitPrice&{&&&}&=&0.99;
&&&&&&&&public&int&AlbumId&{&&&}
&&&&&&&&public&Album&Album&{&&&}
&&&&&&&&public&int&GenreId&{&&&}
&&&&&&&&public&Genre&Genre&{&&&}
&&&&&&&&public&int&MediaTypeId&{&&&}
&&&&&&&&public&MediaType&MediaType&{&&&}
&&&&&&&&public&virtual&ICollection&playlisttrack&&PlaylistTracks&{&&&}
&&&&&&&&&&&&=&new&HashSet&playlisttrack&();
&&&&public&class&Playlist
&&&&&&&&public&int&PlaylistId&{&&&}
&&&&&&&&public&string&Name&{&&&}
&&&&&&&&public&virtual&ICollection&playlisttrack&&PlaylistTracks&{&&&}
&&&&&&&&&&&&=&new&HashSet&playlisttrack&();
&&&&public&class&PlaylistTrack
&&&&&&&&//&Composite&key&(PlaylistId&&&TrackId)
&&&&&&&&//&Many-to-many&relationship&between&Playlist&and&Track&table
&&&&&&&&public&int&PlaylistId&{&&&}
&&&&&&&&public&Playlist&Playlist&{&&&}
&&&&&&&&public&int&TrackId&{&&&}
&&&&&&&&public&Track&Track&{&&&}
&&&&#endregion
&/playlisttrack&
再次我要支持EF7中要注意的两个不同之处: (1) 表明默认不是复数形式的。还有 (2) 多对多关系(在此时)不会被默认约定所识别。对于表明,我个人倾向于选择单数形式的名称。因此,我们的DbContext如下:
#region&DbContext
&&&&public&class&MyDbContext&:&DbContext
&&&&&&&&#region&DbSet
&&&&&&&&public&DbSet&artist&&Artists&{&&&}
&&&&&&&&public&DbSet&album&&Albums&{&&&}
&&&&&&&&public&DbSet&mediatype&&MediaTypes&{&&&}
&&&&&&&&public&DbSet&genre&&Genres&{&&&}
&&&&&&&&public&DbSet&track&/&&Tracks&{&&&}
&&&&&&&&public&DbSet&playlist&&Playlists&{&&&}
&&&&&&&&public&DbSet&playlisttrack&&PlaylistTracks&{&&&}
&&&&&&&&#endregion
&&&&&&&&protected&override&void&OnModelCreating(ModelBuilder&modelBuilder)
&&&&&&&&&&&&modelBuilder.Entity&playlisttrack&()
&&&&&&&&&&&&&&&&.HasKey(pT&=&&new&{&pT.PlaylistId,&pT.TrackId&});
&&&&&&&&&&&&base.OnModelCreating(modelBuilder);
&&&&&&&&protected&override&void&OnConfiguring(DbContextOptionsBuilder&optionsBuilder)
&&&&&&&&&&&&var&sqliteConn&=&new&SqliteConnection(@"DataSource&=&Chinook.db");
&&&&&&&&&&&&optionsBuilder.UseSqlite(sqliteConn);
&&&&#endregion
&/playlisttrack&
如我们的代码中所示,我们手动地为PlaylistTrack表设置一个组合键,使用流畅的API将其作为两个实体(Playlist和Track)间多对多关系的标记信号。
还有就是,链接字符串只是简单的表明了SQLite数据库文件的位置,其名称被硬编码成了 'Chinook.db' ,与可执行文件处在相同的目录中(大部分时候是 Debug (或者有时是 Release) 文件夹下面)。我们也可以将它设置为相对或者绝对路径。
&翻译的不错哦!
现在向Main()添加一些代码来测试创建数据库,还有其基于我们的模型的定义:
static&void&Main(string[]&args)
&&&&using&(var&context&=&new&MyDbContext())
&&&&&&&&context.Database.EnsureCreated();
&&&&//Console.ReadKey();
运行 Main(), 然后看看output文件夹,我们将会看到一个新创建的数据库,叫做Chinook.db。 通过你的SQLite工具查看一下这个数据库 (我使用的是一个叫做 'SQLite Manager' 的Firefox扩展) 的定义:
注意,如果相同的数据库还不存在,那么EF7就会基于我们DBContext(还有我们的模型类)创建出来一个。如果它已经存在了,那么无需再去花时间确认其同我们目前的上线文和模型的兼容性。只要使用目前已经有的数据库就行了。
&翻译的不错哦!
往数据库增加数据
创建一个方法, InsertData(), 并且从 Main() 调用它, 一次查询一些假数据:
private&static&void&InsertData()
&&&&&&&&&&&&Artist&aArtist&=&new&Artist&{&Name&=&"Artist&A"&};
&&&&&&&&&&&&List&artist&&someArtists&=&new&List&artist&
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&new&Artist&{&Name&=&"Artist&B"&},
&&&&&&&&&&&&&&&&new&Artist&{&Name&=&"Artist&C"&}
&&&&&&&&&&&&};
&&&&&&&&&&&&
&&&&&&&&&&&&Artist&anotherArtist&=&new&Artist
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&Name&=&"D",
&&&&&&&&&&&&&&&&//&Making&user&of&&new&HashSet&album&()&&initialized&in&Artist&model
&&&&&&&&&&&&&&&&Albums&=
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&new&Album&{&Title&=&"D&s&1st&Album"&},
&&&&&&&&&&&&&&&&&&&&new&Album&{&Title&=&"D&s&2nd&Album"&}
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&};
&&&&&&&&&&&&List&album&&someAlbums&=&new&List&album&
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&new&Album&{&Title&=&"Album&X",&ArtistId&=&1&},
&&&&&&&&&&&&&&&&new&Album&{&Title&=&"Album&Y",&ArtistId&=&3&},
&&&&&&&&&&&&&&&&new&Album&{&Title&=&"Album&Z",&ArtistId&=&2&}
&&&&&&&&&&&&};
&&&&&&&&&&&&List&mediatype&&someMediaTypes&=&new&List&mediatype&
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&new&MediaType&{&Name&=&"Mp3&Type"&},
&&&&&&&&&&&&&&&&new&MediaType&{&Name&=&"AAC&Type"&}
&&&&&&&&&&&&};
&&&&&&&&&&&&List&genre&&someGenres&=&new&List&genre&
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&new&Genre&{&Name&=&"Genre&A"&},
&&&&&&&&&&&&&&&&new&Genre&{&Name&=&"Genre&B"&}
&&&&&&&&&&&&};
&&&&&&&&&&&&List&playlist&&somePlaylists&=&new&List&playlist&
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&new&Playlist&{&Name&=&"Playlist&A"&},
&&&&&&&&&&&&&&&&new&Playlist&{&Name&=&"Playlist&B"&}
&&&&&&&&&&&&};
&&&&&&&&&&&&List&track&/&&someTracks&=&new&List&track&/&
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&new&Track&{&Name&=&"Track&001",&AlbumId&=&1,&MediaTypeId&=&1,&GenreId&=&1&},
&&&&&&&&&&&&&&&&new&Track&{&Name&=&"Track&002",&AlbumId&=&1,&MediaTypeId&=&1,&GenreId&=&2&},
&&&&&&&&&&&&&&&&new&Track&{&Name&=&"Track&003",&AlbumId&=&2,&MediaTypeId&=&2,&GenreId&=&1,&UnitPrice&=&2.99&},
&&&&&&&&&&&&&&&&new&Track&{&Name&=&"Track&004",&AlbumId&=&1,&MediaTypeId&=&2,&GenreId&=&1&},
&&&&&&&&&&&&&&&&new&Track&{&Name&=&"Track&005",&AlbumId&=&3,&MediaTypeId&=&1,&GenreId&=&2,&UnitPrice&=&3.99&}
&&&&&&&&&&&&};
&&&&&&&&&&&&List&playlisttrack&&somePlaylistTracks&=&new&List&playlisttrack&
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&new&PlaylistTrack&{&PlaylistId&=&2,&TrackId&=&1&}
&&&&&&&&&&&&};
&&&&&&&&&&&&using&(var&context&=&new&MyDbContext())
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&context.Artists.Add(aArtist);
&&&&&&&&&&&&&&&&context.Artists.AddRange(someArtists);
&&&&&&&&&&&&&&&&context.SaveChanges();&//&Persist&data&to&database
&&&&&&&&&&&&&&&&context.Albums.AddRange(someAlbums);
&&&&&&&&&&&&&&&&context.MediaTypes.AddRange(someMediaTypes);
&&&&&&&&&&&&&&&&context.Genres.AddRange(someGenres);
&&&&&&&&&&&&&&&&context.Playlists.AddRange(somePlaylists);
&&&&&&&&&&&&&&&&context.Tracks.AddRange(someTracks);
&&&&&&&&&&&&&&&&context.SaveChanges();&//&Persist&data&to&database
&&&&&&&&&&&&&&&&context.PlaylistTracks.AddRange(somePlaylistTracks);
&&&&&&&&&&&&&&&&context.Artists.Add(anotherArtist);
&&&&&&&&&&&&&&&&context.SaveChanges();&//&Persist&data&to&database
&&&&&&&&&&&&}
&&&&&&&&}&&&&&&&&
&/playlisttrack&
运行程序,我们会看到新插入的数据如下:
如果你新增了一个Album,其外键 (ArtistId) 并没有对应到一个现有Artist的主键,那你就会收到一个&SQLite 'FOREIGN KEY' 约束异常。&因此基本的想法就是,首先添加”父“表(Artist)的数据,对它进行保存,然后输入”子“表(Album)的数据, 限制就是每个新加的专辑都会有外键引用一个现有艺术家的主键。这常常是通过一个下拉列表&(HTML), 或者是 combo-box (WPF)来实现的。所以一对多关系 (一个 Artist 对应多个 Album), (一个 Album 包含多个 Track), (一个音乐作品必须是现有媒体类型的其中一个), 还有 (Genre - Tracks: 多个 Track 属于一个特定的 Genere)同样如此。
这就是为什么你会看到上线文中的 SaveChanges() 会被调用多次。EF7默认启用了外键约束(还有唯一性约束),很不错。
&翻译的不错哦!
继续并从&&下载示例SQLite Chinook数据库。提取zip文件,你要用到的就是&'Chinook_Sqlite_AutoIncrementPKs.sqlite'。将其重命名为 'Chinook.db' (根据我们在 DbContext 中的链接字符串) 并将其复制到 (或者如有已经存在就覆盖) Debug文件夹。原因是,示例数据库包含了易于使用的数据。
创建一个方法, SelectData(), 然后在Main()中调用它。
private&static&void&SelectData()
&&&&using&(var&context&=&new&MyDbContext())
&&&&&&&&#region&Get&all&albums&that&contain&the&track&with&the&word&&Love&&in&its&title
&&&&&&&&var&query&=&context.Tracks
&&&&&&&&&&&&.Include(t&=&&t.Album)
&&&&&&&&&&&&.Where(t&=&&t.Name.Contains("Love"))
&&&&&&&&&&&&.Select(t&=&&t.Album)
&&&&&&&&&&&&.Distinct();
&&&&&&&&Console.WriteLine($"Number&of&albums&satisfied&the&condition:&{query.Count()}");
&&&&&&&&foreach&(Album&item&in&query)
&&&&&&&&&&&&Console.WriteLine($"\t&{item.Title}");
输出结果:
另外一个示例:
#region&Get&all&tracks&with&price&&&$1.00
var&query2&=&context.Tracks
&&&&.Where(t&=&&t.UnitPrice&&&1.00);
Console.WriteLine($"Number&of&tracks&with&price&greater&than&$1.00:&{query2.Count()}&\n");
#endregion
#region&Get&all&playlists&that&contain&track&with&Id&1
var&query3&=&context.Tracks
&&&&.Include(t&=&&t.PlaylistTracks)
&&&&.ThenInclude(t&=&&t.Playlist)
&&&&.Where(t&=&&t.TrackId&==&1)
&&&&.Single();
var&playlists&=&query3.PlaylistTracks
&&&&.Select(p&=&&p.Playlist);
Console.WriteLine($"Number&of&playlists&with&track&Id&1&is:&{playlists.Count()}");
foreach&(Playlist&p&in&playlists)
&&&&Console.WriteLine($"\t&Id&=&{p.PlaylistId},&Name&=&{p.Name}");
#endregion
&翻译的不错哦!
更新和删除数据
再次创建一个方法并在Main()中调用。
private&static&void&UpdateAndDeleteData()
&&&&#region&Change&the&name&of&the&track&with&Id&2&to&"No&Name"
&&&&using&(var&context&=&new&MyDbContext())
&&&&&&&&var&track&=&context.Tracks
&&&&&&&&&&&&.Where(t&=&&t.TrackId&==&2)
&&&&&&&&&&&&.Single();
&&&&&&&&track.Name&=&"No&Name";
&&&&&&&&context.SaveChanges();
&&&&#endregion
&&&&#region&Delete&all&tracks&with&Id&&&3507
&&&&using&(var&context&=&new&MyDbContext())
&&&&&&&&var&tracks&=&context.Tracks
&&&&&&&&&&&&.Where(t&=&&t.TrackId&&&3507);
&&&&&&&&context.Tracks.RemoveRange(tracks);
&&&&&&&&context.SaveChanges();
&&&&#endregion
注意,如果尝试从附表删除数据(例如 Artist),而存在字表对其的引用 (例如 Album), 因为违背了外键约束,所以会发生一个异常的抛出。
&翻译的不错哦!
消灭0回复。}

我要回帖

更多关于 entity framework pdf 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信