在C#中,Entity Framework (EF) 是一个流行的对象关系映射器 (ORM),它使得开发者可以使用面向对象的方式来操作数据库。使用EF,你可以将数据库表映射到C#类,并使用EF提供的方法来执行数据库操作,如增加、删除、修改和查询数据。
以下是如何使用Entity Framework Core(EF Core)实现增删改查的基本步骤:
1. 定义实体类
首先,你需要定义与数据库表对应的C#实体类。
csharp代码 
| using System.ComponentModel.DataAnnotations; | |
| using System.ComponentModel.DataAnnotations.Schema; | |
| public class Blog | |
| { | |
| [Key] | |
| [DatabaseGenerated(DatabaseGeneratedOption.Identity)] | |
| public int BlogId { get; set; } | |
| public string Url { get; set; } | |
| public List<Post> Posts { get; set; } | |
| } | |
| public class Post | |
| { | |
| [Key] | |
| [DatabaseGenerated(DatabaseGeneratedOption.Identity)] | |
| public int PostId { get; set; } | |
| public string Title { get; set; } | |
| public string Content { get; set; } | |
| [ForeignKey("Blog")] | |
| public int BlogId { get; set; } | |
| public Blog Blog { get; set; } | |
| } | 
2. 配置DbContext
接下来,你需要配置DbContext,这是EF Core的核心类,它提供了数据库操作的方法。
csharp代码 
| using Microsoft.EntityFrameworkCore; | |
| public class BloggingContext : DbContext | |
| { | |
| public DbSet<Blog> Blogs { get; set; } | |
| public DbSet<Post> Posts { get; set; } | |
| protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) | |
| { | |
| optionsBuilder.UseSqlServer("你的数据库连接字符串"); | |
| } | |
| } | 
3. 执行增删改查操作
使用DbContext实例,你可以执行增删改查操作。
添加 (Create)
csharp代码 
| using (var context = new BloggingContext()) | |
| { | |
| var newBlog = new Blog { Url = "http://blogs.msdn.com/adonet" }; | |
| context.Add(newBlog); | |
| context.SaveChanges(); | |
| } | 
读取 (Read)
csharp代码 
| using (var context = new BloggingContext()) | |
| { | |
| var blog = context.Blogs.FirstOrDefault(b => b.BlogId == 1); | |
| } | 
更新 (Update)
csharp代码 
| using (var context = new BloggingContext()) | |
| { | |
| var blog = context.Blogs.Find(1); | |
| blog.Url = "http://example.com/blogs"; | |
| context.SaveChanges(); | |
| } | 
删除 (Delete)
csharp代码 
| using (var context = new BloggingContext()) | |
| { | |
| var blog = context.Blogs.Find(1); | |
| context.Blogs.Remove(blog); | |
| context.SaveChanges(); | |
| } | 
4. 依赖注入 (Dependency Injection)
在ASP.NET Core项目中,通常使用依赖注入来管理DbContext实例的生命周期。
在Startup.cs中配置服务:
csharp代码 
| public void ConfigureServices(IServiceCollection services) | |
| { | |
| services.AddDbContext<BloggingContext>(options => | |
| options.UseSqlServer("你的数据库连接字符串")); | |
| } | 
然后在控制器或服务中注入DbContext:
csharp代码 
| public class BlogController : ControllerBase | |
| { | |
| private readonly BloggingContext _context; | |
| public BlogController(BloggingContext context) | |
| { | |
| _context = context; | |
| } | |
| // ... 这里可以使用 _context 进行数据库操作 ... | |
| } | 
确保数据库连接字符串在你的应用程序的配置文件中正确设置,以便EF Core可以连接到数据库。
以上就是在C#中使用Entity Framework Core实现增删改查的基本步骤。实际项目中可能还需要处理更复杂的情况,比如事务管理、并发冲突、查询优化等。
-  - C#大数据MEF分页用法
 
在C#中,MEF (Managed Extensibility Framework) 是.NET Framework 4中引入的一个轻量级依赖注入容器,它允许你创建可扩展的应用程序。MEF与分页没有直接的联系,因为分页通常与数据库查询和结果集处理相关,而不是与应用程序的扩展性有关。
然而,如果你想要在一个基于MEF的插件系统中实现分页功能,你可以将分页逻辑封装在一个插件或服务中,然后通过MEF将其注入到需要分页功能的应用程序中。
以下是一个简化的例子,演示了如何在C#中使用MEF来实现分页:
首先,定义一个分页接口:
csharp代码
| public interface IPaginator | |
| { | |
| IEnumerable<T> Paginate<T>(IQueryable<T> query, int page, int pageSize); | |
| } | 
然后,实现该接口的一个类:
csharp代码
| [Export(typeof(IPaginator))] | |
| public class Paginator : IPaginator | |
| { | |
| public IEnumerable<T> Paginate<T>(IQueryable<T> query, int page, int pageSize) | |
| { | |
| return query.Skip((page - 1) * pageSize).Take(pageSize); | |
| } | |
| } | 
在这个例子中,[Export(typeof(IPaginator))] 属性告诉MEF这个类实现了IPaginator接口,并且可以被其他部分的应用程序所导入。
接下来,在需要使用分页功能的地方,你可以导入IPaginator:
csharp代码
| [Import] | |
| public IPaginator Paginator { get; set; } | |
| public void SomeMethodThatUsesPagination() | |
| { | |
| // 假设你有一个数据库上下文和表 | |
| var dbContext = new MyDbContext(); | |
| var allItems = dbContext.MyTable; | |
| int page = 1; // 当前页 | |
| int pageSize = 10; // 每页显示数量 | |
| var paginatedItems = Paginator.Paginate(allItems, page, pageSize); | |
| // 现在你可以处理分页后的数据了 | |
| foreach (var item in paginatedItems) | |
| { | |
| // 处理每个项目 | |
| } | |
| } | 
在这个SomeMethodThatUsesPagination方法中,我们通过[Import]属性导入了IPaginator的实例。然后,我们可以调用Paginator.Paginate方法来获取分页后的数据。
要启用MEF的导入和导出功能,你需要在应用程序的启动代码中配置MEF容器:
csharp代码
| var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly()); | |
| var container = new CompositionContainer(catalog); | |
| var myObject = new MyObject(); | |
| container.ComposeParts(myObject); | 
上面的代码创建了一个CompositionContainer,并且告诉它从哪里查找导出的组件(在这个例子中是当前正在执行的程序集)。然后,它调用ComposeParts方法来激活MyObject中的导入。
请注意,这个例子非常简化,实际应用中可能需要考虑更多的细节,比如错误处理、性能优化和数据库查询的延迟执行等。
如果你正在处理大数据集,你可能需要考虑更高效的分页策略,比如直接在数据库层面使用LIMIT和OFFSET(对于SQL数据库),或者在查询中使用流式处理来减少内存消耗。