EF配置DbContext已有实体类和数据库

使用 EF 如果已经有了 实体类 和 数据库 ,就不需要考虑 CodeFirst 或者 DataBaseFirst 的问题

4.3
(3)

本文介绍EF配置DbContext已有实体类和数据库的详细方法,直接配置 DbContext 然后直接使用即可。详细可以从以下三个方面开始介绍:

1. 检查实体类

2. 配置 DbContext

3. 使用 DbCotnext 处理数据库数据

EF配置DbContext已有实体类和数据库

1. 手动创建或者从别处复制实体类

注意:

  • 实体类 对应着 数据库中表
  • 实体类可以手动编写,也可以由 EF 生成
  • 实体类中字段可以比对应的数据表少字段
  • 实体类中不允许存在对应数据库表没有的字段

如果 实体类中 存在 对应数据表中不存在的字段,会报如下错误

EF配置DbContext已有实体类和数据库

本次范例使用如下实体类如下

public partial class Article
{
    public int ArticleId { get; set; }

    public string ArticleTitle { get; set; }
    public string ArticleContent { get; set; }
    //浏览量
    public int? ArticleViews { get; set; }
    
    public DateTime? ArticlePublicationDate { get; set; }
    public DateTime? ArticleLastModificationDate { get; set; }
    //点赞数
    public int? ArticleLikeCount { get; set; }
    //逻辑删除
    public int? DelFlag { get; set; }

    //一篇文章,只有一个作者
    public int UserId { get; set; }

    //同一篇文章标签可以用多个,但通常只能属于一个分类;
    public int SortId { get; set; }
}

2. 创建 DbContext

public class BlogContext:DbContext
{
    // 从外部接收配置 使用有参构造函数
    public BlogContext(DbContextOptions<BlogContext> options) : base(options)
    { }

    // 实体类
    public DbSet<Article> Articles { get; set; }
}

使用带参数的构造函数的DbContext ,需要在创建 DbContext 实例时,传入 DbContextOptions<TContext> 配置

var optionsBuilder = new DbContextOptionsBuilder<BlogContext>();
optionsBuilder.UseSqlite(@"Data Source=E:\MyBlogSqlite.db");

using (BlogContext blogContext = new BlogContext(optionsBuilder.Options))
{
	//...
}

3.调用 DbContenxt 的范例

如下展示一些 使用 DbContext 的范例

【范例】返回数据中实体类数据行数

var optionsBuilder = new DbContextOptionsBuilder<BlogContext>();
optionsBuilder.UseSqlite(@"Data Source=E:\MyBlogSqlite.db");

using (BlogContext blogContext = new BlogContext(optionsBuilder.Options))
{
    int result = blogContext.Articles.Count();
    Console.WriteLine(result);
}

【范例】把数据从一个 DbContext 复制到 另一个 DbContext

//创建2个 DbContext
MyBlogContext myBlogContext = new MyBlogContext();
CurrentBlogContext currentBlogContext = new CurrentBlogContext();

//读取 myBlogContext 的所有 articles
//IQueryable<Article> articles = myBlogContext.Articles.Where(a => true);
IQueryable<Article> articles = myBlogContext.Articles;

//生成 CurrentArticle
List<CurrentArticle> list = new List<CurrentArticle>();
foreach (Article item in articles)
{
    CurrentArticle currentArticle = new CurrentArticle();
    currentArticle.ArticleTitle = item.ArticleTitle;
    currentArticle.ArticleContent = item.ArticleContent;
    currentArticle.ArticlePublicationDate = item.ArticlePublicationDate;
    currentArticle.ArticleLastModificationDate = item.ArticleLastModificationDate;
    currentArticle.SortId = 1;
    currentArticle.UserId = 1;

    list.Add(currentArticle);
}

//写入 CurrentArticle 到 currentBlogContext
foreach (CurrentArticle ca in list)
{
    currentBlogContext.Articles.Add(ca);
}
//保存(重要)
currentBlogContext.SaveChanges();

【范例】修改 DbContext 数据

CurrentBlogContext currentBlogContext = new CurrentBlogContext();
IQueryable<CurrentArticle> currentArticles = 
    currentBlogContext.Articles.Where(a => a.ArticleId < 48);
foreach (var item in currentArticles)
{
    item.SortId = 1;
    item.UserId = 1;
    currentBlogContext.Articles.Update(item);
}

currentBlogContext.SaveChanges();

【范例】对比 两个 DbContext 数据

MyBlogContext myBlogContext = new MyBlogContext();

IQueryable<Article> articles = myBlogContext.Articles.Where(a => true);

CurrentBlogContext currentBlogContext = new CurrentBlogContext();

foreach (Article item in articles)
{
    CurrentArticle currentArticle = currentBlogContext.Articles.Where(a => a.ArticleTitle == item.ArticleTitle).FirstOrDefault();
    if (currentArticle == null)
    {
        Console.WriteLine("存在错误 文章不存在");
        Console.WriteLine(item.ArticleTitle);
        return;
    }

    if (currentArticle.ArticleContent == item.ArticleContent)
    {
        Console.WriteLine(item.ArticleTitle + "True");
    }
    else
    {
        Console.WriteLine(item.ArticleTitle + "出错");
        return;
    }

}

Console.WriteLine("比对成功 全部正确");
Console.WriteLine(articles.Count());

共计3人评分,平均4.3

到目前为止还没有投票~

很抱歉,这篇文章对您没有用!

让我们改善这篇文章!

告诉我们我们如何改善这篇文章?

文章目录

本文投稿作者:飒飒,如若转载,请注明出处:https://iymark.com/articles/3114.html

(1)
微信公众号
飒飒的头像飒飒普通用户
上一篇 2022年09月20日 20:08
下一篇 2022年09月20日 21:59

你可能感兴趣的文章

发表回复

登录后才能评论
微信小程序
微信公众号